攻城狮凌风

2014华为机试之字符压缩字符过滤字符串加减法

1.字符过滤

   

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。

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

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

示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”

main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。


  1. string Filter(const string& input){  
  2.   
  3.     int flag[26]={0};  
  4.     string output;  
  5.     for(int i=0;i<input.length();i++){  
  6.         flag[input[i]-'a']++;  
  7.         if(flag[input[i]-'a']==1)  
  8.             output.append(1,input[i]);  
  9.     }  
  10.     return output;  
  11. }  
  12. int main()  
  13. {  
  14.     string input;  
  15.     cin>>input;  
  16.     cout<<Filter(input)<<endl;  
  17.     return 0;  
  18. }  


2.字符串的加减法

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。

补充说明:
1、操作数为正整数,不需要考虑计算结果溢出的情况。
2、若输入算式格式错误,输出结果为“0”。

要求实现函数: 
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);

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

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

示例 
输入:“4 + 7”  输出:“11”
输入:“4 - 7”  输出:“-3”
输入:“9 ++ 7”  输出:“0” 注:格式错误


  1. #include "iostream"    
  2. #include<string>  
  3. using namespace std;    
  4. bool process(const string& input,char*output){  
  5.     int num1=0,num2=0;  
  6.     char  p;  
  7.     bool flag=true;//表示第1个数正在读取,false表示第2个数正在读取  
  8.   
  9.     for(int i=0;i<input.length();i++)  
  10.         if(input[i]!='+'&&input[i]!='-'&&(input[i]<'0'||input[i]>'9')){//非法字符  
  11.             cout<<" wrong input"<<endl;  
  12.             return false;  
  13.         }  
  14.         else if(flag&&input[i]!='+'&&input[i]!='-')//读取第一个数  
  15.             num1=10*num1+input[i]-'0';  
  16.         else if(!flag&&input[i]!='+'&&input[i]!='-')//读取第二个数  
  17.             num2=10*num2+input[i]-'0';  
  18.         else if(flag&&input[i]=='+'||input[i]=='-'){//在第一个数正在读取的情况后读取到运算符  
  19.             p=input[i];  
  20.             flag=false;  
  21.         }  
  22.         else{  
  23.             cout<<"wrong input"<<endl;  
  24.             return false;  
  25.         }  
  26.   
  27.         switch(p){  
  28.             case '+':  
  29.                    itoa(num1+num2, output,10) ;return true;  
  30.             case '-' :  
  31.                     itoa(num1-num2, output,10) ;return true;  
  32.         }  
  33. }  
  34. int main()  
  35. {  
  36.     string input;  
  37.     cin>>input;  
  38.     char*output= new char[4];  
  39.     memset(output,'\0',4);  
  40.   
  41.     if( process(input,output))  
  42.         cout<<output<<endl;  
  43.   
  44.         return 0;  
  45. }  



3.字符压缩

     通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
    压缩规则:
          1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
          2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。

    要求实现函数: 
    void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

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

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

            输入:“cccddecc”   输出:“3c2de2c”

            输入:“adef”     输出:“adef”
            输入:“pppppppp” 输出:“8p”


  1. #include "iostream"    
  2. #include<string>  
  3. using namespace std;    
  4. void stringZip(const char *pInputStr,long lInputLen, char *pOutputStr){  
  5.     if(!pInputStr)  
  6.         return;  
  7.   
  8.   
  9.     string s;  
  10.     char* temp=new char[10];//单个字符最高计数999999999次  
  11.   
  12.     const char* p=pInputStr;  
  13.     char* output=pOutputStr;  
  14.     char start=*pInputStr;  
  15.     for(int i=0,cout=1;i<lInputLen;i++){  
  16.         p++;  
  17.         if(i==lInputLen-1||*p!=start){  
  18.             memset(temp,'\0',10);  
  19.             itoa(cout,temp,10);  
  20.             s=s+temp;  
  21.             s+=start;  
  22.   
  23.             start=*p;  
  24.             cout=1;  
  25.         }  
  26.        else  
  27.            cout++;  
  28.     }  
  29.     strcpy(pOutputStr,s.c_str());  
  30. }  
  31. int main()  
  32. {  
  33.     string input;  
  34.     cin>>input;//输入  
  35.     char*output= new char[100];  
  36.     memset(output,'\0',100);  
  37.   
  38.     stringZip(input.c_str(),input.length(),output);  
  39.   
  40.     cout<<output<<endl;  
  41.     return 0;  
  42. }  


4.总结

        (1) itoa函数可以转换负数成含有'-'的字符串

        (2)指针指向元素能使用p[n],*(p+n)输出,*的优先级大于++,因此*p++先取值后在自加。

        (3)string 能够“+” 字符串指针和字符




参考

      1.2014年华为上机题目


posted on 2015-06-24 10:49  攻城狮凌风  阅读(266)  评论(0编辑  收藏  举报

导航