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; }