zoukankan      html  css  js  c++  java
  • 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,'',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,'',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,'',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年华为上机题目


  • 相关阅读:
    leetcode 110 Balanced Binary Tree
    Spark编程模型
    Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS
    __x__(27)0907第四天__ float 浮动
    __x__(26)0907第四天__文档流_网页最底层
    __x__(25)0907第四天__ overflow 父元素对溢出内容的处理
    __x__(24)0907第四天__ display 和 visibility
    __x__(23)0907第四天__浏览器默认样式
    __x__(22)0907第四天__ 垂直外边距重叠
    __x__(21)0907第四天__ css 盒模型 (框模型)
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393026.html
Copyright © 2011-2022 走看看