华为2014机试题目

一、题目描述(60分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度         
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“deefd”        输出:“def”
输入:“afafafaf”     输出:“af”
输入:“pppppppp”     输出:“p”
main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
 
二、题目描述(40分):
通过键盘输入一串小写字母(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”
三、题目描述(50分): 
通过键盘输入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 <cstring>  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5. //题目一  
  6. void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)  
  7. {  
  8.     bool hash[26] = {0};    //统计字符是否出现,这个想法很好哟    
  9.     int i , j;    
  10.     for(i = 0 , j = 0 ; i < lInputLen; i++)    
  11.     {    
  12.         if(false == hash[pInputStr[i] - 'a'])     //该字符还木有出现过    
  13.         {    
  14.             hash[pInputStr[i] - 'a'] = true;    
  15.             pOutputStr[j++] = pInputStr[i];    
  16.         }    
  17.     }    
  18.     pOutputStr[j] = '\0';    
  19. }  
  20. //题目二第一种解法  
  21. void stringZip1(const char* pInputStr , long lInputLen , char* pOutputStr)    
  22. {    
  23.     int i , j , k , num;    
  24.     char buffer[20];    
  25.     for(i = 0 , k = 0; i < lInputLen; )    
  26.     {    
  27.         num = 0;    
  28.         for(j = i + 1 ; j < lInputLen ; ++j)    
  29.         {    
  30.             if(pInputStr[i] == pInputStr[j])     //统计字符串中每个字符后面连续出现的重复字母次数    
  31.                 ++num;    
  32.             else    
  33.                 break;    
  34.         }//for    
  35.         if(0 != num)    //num可能是两位或三位或更多位的整数    
  36.         {    
  37.             memset(buffer , 0 , sizeof(buffer));//将数组元素全部用0代替    
  38.             itoa(num + 1,buffer,10);      //将整数按10进制转换为字符串    
  39.             strcpy(pOutputStr + k , buffer);    
  40.             k += strlen(buffer);    
  41.         }    
  42.         pOutputStr[k++] = pInputStr[i];    
  43.         i = i + num + 1;    
  44.     }//for    
  45.     pOutputStr[k] = '\0';    
  46. }    
  47. //题目二第二种解法  
  48. void stringZip2(const char *pInputStr, long lInputLen, char *pOutputStr)    
  49. {       
  50.     if(lInputLen == 1)    
  51.     {    
  52.         pOutputStr[0] = pInputStr[0];    
  53.         pOutputStr[1] = 0;    
  54.         return;    
  55.     }    
  56.   
  57.     char chPre = pInputStr[0];    
  58.     int count = 1;    
  59.     int outIndex = 0;    
  60.     char tmp[100];    
  61.     for(size_t i = 1 ;i <= lInputLen ;i++)    
  62.     {    
  63.         if(pInputStr[i] != chPre)    
  64.         {    
  65.             if(count == 1)    
  66.                 pOutputStr[outIndex++] = chPre;    
  67.             else    
  68.             {    
  69.                 sprintf(tmp ,"%d%c" ,count ,chPre);//这两个函数值得学习   
  70.                 strcpy(pOutputStr + outIndex ,tmp);         
  71.                 outIndex += strlen(tmp);    
  72.             }    
  73.             chPre = pInputStr[i];    
  74.             count = 1;    
  75.         }    
  76.         else    
  77.         {    
  78.             count++;    
  79.         }    
  80.     }    
  81.     pOutputStr[outIndex] = '\0';    
  82. }    
  83. //题目三  
  84. void arithmetic(const char* pInputStr , long lInputLen , char* pOutputStr)    
  85. {    
  86.     int i,j,num1,num2,result,num_space;  
  87.     char buffer[4];  
  88.     bool add=false,dec=false;  
  89.     for (i=0,num_space=0;i<lInputLen;i++)  
  90.     {  
  91.         if(pInputStr[i]==' ')  
  92.             num_space++;  
  93.     }  
  94.     if (2!=num_space)//如果空格数不等于2  
  95.     {  
  96.         pOutputStr[0]='0';  
  97.         pOutputStr[1]='\0';  
  98.         return;  
  99.     }  
  100.     num1=num2=0;  
  101.     for (i=0;pInputStr[i]!=' ';i++)  
  102.     {  
  103.         if (pInputStr[i]>='0'&&pInputStr[i]<='9')  
  104.             num1=num1*10+pInputStr[i]-'0';  
  105.         else    //如果操作数非法  
  106.         {  
  107.             pOutputStr[0]='0';  
  108.             pOutputStr[1]='\0';  
  109.             return;  
  110.         }  
  111.     }  
  112.     if (pInputStr[i+2]!=' ')//如果第一个操作符右边不是空格符  
  113.     {  
  114.         pOutputStr[0]='0';  
  115.         pOutputStr[1]='\0';  
  116.         return;  
  117.     }  
  118.     else   
  119.     {  
  120.         if ('+'==pInputStr[i+1])  
  121.             add=true;  
  122.         else if ('-'==pInputStr[i+1])  
  123.             dec=true;  
  124.         for (i+=3;i<lInputLen;i++)  
  125.         {  
  126.             if (pInputStr[i]>='0'&&pInputStr[i]<='9')  
  127.                 num2=num2*10+pInputStr[i]-'0';  
  128.             else    //如果操作数非法  
  129.             {  
  130.                 pOutputStr[0]='0';  
  131.                 pOutputStr[1]='\0';  
  132.                 return;  
  133.             }  
  134.         }  
  135.         if(add)  
  136.             result=num1+num2;  
  137.         else  
  138.             result=num1-num2;  
  139.         memset(buffer , 0 , sizeof(buffer));//很实用的几个函数   
  140.         itoa(result,buffer,10);  
  141.         strcpy(pOutputStr,buffer);  
  142.     }  
  143. }    
  144.   
  145. int main()  
  146. {  
  147.     cout<<"华为2014机试题目.......""只为学习....."<<endl;  
  148.       
  149.     char inputstr[256];  
  150.     char outputstr[256];  
  151.     cout<<"请输入一串字符串"<<endl;  
  152.     cin.getline(inputstr,256);  
  153.     //题目一  
  154.     //stringFilter(inputstr,strlen(inputstr),outputstr);  
  155.     //题目二  
  156.     //stringZip1(inputstr,strlen(inputstr),outputstr);  
  157.     //stringZip2(inputstr,strlen(inputstr),outputstr);  
  158.     //题目三  
  159.     arithmetic(inputstr,strlen(inputstr),outputstr);  
  160.       
  161.     cout<<outputstr<<endl;  
  162.   
  163.       
  164.   
  165.     system("pause");  
  166.     return 1;  
  167. }  
  168.   
  169.   
  170. 参考原文地址:http://blog.csdn.net/hackbuteer1/article/details/11132567 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值