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年华为上机题目


  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393026.html
Copyright © 2011-2022 走看看