华为最新的上机题

时间:2022-06-07 15:47:12

1.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。

比如字符串“abacacde”过滤结果为“abcde”。

要求实现函数:

void stringFilter(const char *pInputStr,long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串 lInputLen:  输入字符串长度        

【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

 

2.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

压缩规则:

1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".

2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

要求实现函数:

void stringZip(const char *pInputStr, longlInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串 lInputLen:  输入字符串长度        

【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;

 

3. 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:

1. 操作数为正整数,不需要考虑计算结果溢出的情况。

2. 若输入算式格式错误,输出结果为“0”。 

要求实现函数:

void arithmetic(const char *pInputStr, longlInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串  lInputLen:  输入字符串长度        

【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

 

把这三个函数一起实现了,发现华为上机题目还是比较基础,都是一些基本字符串操作,而且两年的题目几乎是一样的!!!!!

#include <iostream>
#include <stack>
using namespace std;

void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	if (pInputStr==NULL||lInputLen<=0)
	{
		return;
	}
	const char *pre=NULL,*current=NULL;
	pre=current=pInputStr;
	int index=0;
	int count=0;
	/*
	思想很简单:两个指针pre ,current 首先都指向输入串首,然后移动current,两种情况
	如果与pre所指相同则计数增加,current移动下一位置,如果不等则把该信息输入pOutputStr
	更新计数和pre指针。
	*/
	while (*current !='\0')
	{
		if (*current==*pre)
		{
			count++;
			current++;
		}
		else
		{
			if (count>1)
			{
				pOutputStr[index++]=count+'0';
			}
			pOutputStr[index++]=*pre;
			pre=current;
			count=0;
		}
	}
	//因为字符串结束而跳出循环,最后的部分还没有存入pOutputStr中所以需要单独操作
	if (count>1)
	{
		pOutputStr[index++]=count+'0';
	}
	pOutputStr[index++]=*pre;
	pOutputStr[index]='\0';//加上字符串结束标志,方便输出
	cout<<pOutputStr<<endl;
}

//这个函数实现就是hash的简单应用
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	if (pInputStr==NULL||lInputLen<=0)
	{
		return ;
	}
	char *output=pOutputStr;
	int hashtable[26]={0};//只有小写字母所以只需要26空间
	while (*pInputStr!='\0')
	{
		hashtable[*pInputStr-'a']++;
		if (hashtable[*pInputStr-'a']>1)
		{
			pInputStr++;
		}
		else
		{
			*output=*pInputStr;
			output++;
			pInputStr++;
		}
	}
	*output='\0';
	cout<<pOutputStr<<endl;
}

void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	const char *p=pInputStr;
	char *output=pOutputStr;
	int indexblank1=0,indexblank2=0;
	while (*p!='\0')
	{
		if (*p==' ')
		{
			if (indexblank1==0)
			{
				indexblank1=p-pInputStr;
			}
			else
				indexblank2=p-pInputStr;
		}
		p++;
	}
	//先检查输入是否符合题目要求
	if (indexblank2-indexblank1!=2)
	{
			*pOutputStr++='0';
			*pOutputStr='\0';
			cout<<"Input error\n";
			return;		
	}
	if (pInputStr[indexblank1+1]!='+'&&pInputStr[indexblank1+1]!='-')
	{
		*pOutputStr++='0';
		*pOutputStr='\0';
		cout<<"Input error\n";
		return;	
	}
	int number1=0,number2=0;
	int result=0;
	for (int i=0;i<indexblank1;i++)
	{
		number1=number1*10+(pInputStr[i]-'0');
	}
	for (int i=indexblank2+1;i<lInputLen;i++)
	{
		number2=number2*10+(pInputStr[i]-'0');
	}
	switch(pInputStr[indexblank1+1])
	{
	case  '+':
		result=number1+number2;
		break;
	case '-':
		result=number1-number2;
		break;
	}
	if (result<0)
	{
		*output='-';
		output++;
	}
	result=abs(result);
	stack <char> sta;
	while (result)
	{
		sta.push((result%10)+'0');
		result/=10;
	}
	while (!sta.empty())
	{
		*output++=sta.top();
		sta.pop();
	}
	*output='\0';
	cout<<pOutputStr<<endl;
}


int main()
{
	char *inputStr="100 + 72";
	char *outputStr=new char[strlen(inputStr)+1];
	/*
	stringZip(inputStr,strlen(inputStr),outputStr);
	stringFilter(inputStr,strlen(inputStr),outputStr);
	*/
	arithmetic(inputStr,strlen(inputStr),outputStr);
	return 0;
}