2014华为上机题C++编程

来源:互联网 发布:java链表的实现 编辑:程序博客网 时间:2024/05/26 12:03


转自 : http://blog.csdn.net/evankaka


华为2014校园招聘的机试题目和2013年的完全一样。

一、题目描述(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打印输出

当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。


下面是我用VS2010写的,思路是每次从源字符串取一个字符,判断目标字符的所有字符是否有重复的,没有,就将此字符再加入到目标字符后面

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <cstring>  
  3. #include <iostream>  
  4. using namespace std;  
  5. void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr)  
  6. {  
  7. int i;  
  8. int j;  
  9. *pOutputStr = *pInputStr;  
  10. int k=0;  
  11. for(i=1;i<lInputLen;i++)  
  12. {  
  13. bool m_flag=false;  
  14. for(j=0;j<i;j++)  
  15. {  
  16. if(pInputStr[i]==pInputStr[j])  
  17. {  
  18. m_flag=false;  
  19. break;  
  20.     }  
  21. else  
  22.   m_flag=true;  
  23. }  
  24. if(m_flag)  
  25. pOutputStr[++k]=pInputStr[i];  
  26. }  
  27. pOutputStr[++k]=0;  
  28. return;  
  29. }  
  30. int _tmain(int argc, _TCHAR* argv[])  
  31. {  
  32.   
  33.    char a[1000];  
  34. char *str=a;  
  35. cin>>str;  
  36. int len=strlen(a)+1;  
  37. char b[1000];  
  38. stringFilter(str,len,b);//b只能用数组,用指针就报错,要用指针的话要给指针分配内存空间,如用new,或将指针指向一个静态数组  
  39. cout<<b;  
  40. system("pause");  
  41. return 0;  
  42. }  


二、题目描述(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”

下面是我写的,两个循环。这个竟然只有40分。。我怎么感觉是最难的呢?用两个for循环,

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <cstring>  
  4. #include <stdlib.h>  
  5. using namespace std;  
  6. const unsigned int max_size=10000;  
  7. void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)  
  8. {  
  9. int i,j;  
  10. int k;  
  11. int x=0;  
  12. for(j=0;j<lInputLen;j++)  
  13. {  
  14. k=0;  
  15. for(i=j+1;i<lInputLen;i++)  
  16. {  
  17. if(pInputStr[i-1]==pInputStr[i])//每次相邻两个进行比较  
  18. k++;  
  19. else  
  20. break;  
  21. }  
  22. if(k>0)  
  23.       {   
  24.    
  25.  k+=1;  
  26. pOutputStr[x++]=(char)(k+'0');  
  27. pOutputStr[x++]=pInputStr[j];  
  28. j+=k-1;//下次比较的起始位置  
  29. }  
  30. else  
  31. {  
  32. pOutputStr[x++]=pInputStr[j];  
  33. }  
  34.   
  35. }  
  36. pOutputStr[x]='\0';  
  37. }  
  38. int _tmain(int argc, _TCHAR* argv[])  
  39. {  
  40. char a[1000];  
  41. cin>>a;  
  42. int len=strlen(a);  
  43. char b[1000];  
  44. stringZip(a,len,b);  
  45. cout<<b;  
  46. system("pause");  
  47. return 0;  
  48. }  



三、题目描述(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” 注:格式错误

这个也不难,输入一个字符串,然后一个for循环找到+或-的位置,然后把数据分成两个字符串,把这两个字符串用atoi转成int就可以做运算了,运算后再用itoa转成char;这里一个要注意啊char *itoa(int value ,char *string ,int radix ),string一定要分配内存空间,可以用静态数组,也可以用动态数组,指针要么指向静态数组要么指向动态数组

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. #include <stdio.h>  
  4. using namespace std;  
  5. void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr)    
  6. {  
  7.     int i;  
  8.     int num=0;  
  9.     int k=0;  
  10.     char *temp1=new char[lInputLen+1];  
  11.     char *temp2=new char[lInputLen+1];  
  12.     for(i=0;i<lInputLen;i++)  
  13.     {  
  14.         if(pInputStr[i]=='+'||pInputStr[i]=='-')  
  15.         {  
  16.             k=i;  
  17.             num++;  
  18.         }  
  19.     }  
  20.     if(k==0||num>1)  
  21.     {  
  22.         *pOutputStr='\0';  
  23.         return;  
  24.     }  
  25.     for(i=0;i<k;i++)  
  26.     temp1[i]=pInputStr[i];  
  27.     temp1[k]='\0';  
  28.     for(i=k+1;i<lInputLen;i++)  
  29.     temp2[i-k-1]=pInputStr[i];  
  30.     temp2[lInputLen]='\0';  
  31.     int a=atoi(temp1);  
  32.     int b=atoi(temp2);  
  33.     int c;  
  34.     if(pInputStr[k]=='+')  
  35.         c=a+b;  
  36.     else  
  37.        c=a-b;  
  38.     itoa(c,pOutputStr,10);  
  39.     delete []temp1;  
  40.     delete []temp2;  
  41. }  
  42.   
  43. int _tmain(int argc, _TCHAR* argv[])  
  44. {  
  45.     char temp[1000];  
  46.     char *src=temp;  
  47.     cin>>src;  
  48.     int len=strlen(src);  
  49.     char *dst=new char[len+1];  
  50.     arithmetic(src,len,dst);  
  51.     if(*dst=='\0')  
  52.         cout<<"0 注:输入错误";  
  53.     else  
  54.     cout<<dst;  
  55.     delete []dst;  
  56.     system("pause");  
  57.     return 0;  
  58. }  




四、亮着电灯的盏数
一条长廊里依次装有n(1n 65535)盏电灯,从头到尾编号123、…n-1n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。

n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。

注:电灯数和学生数一致。

下面是我用VS2010写的,这个还是比较简单的,就是要记得new后要delete

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. using namespace std;  
  4. const unsigned int num_max=65535;   
  5. unsigned int GetLightLampNum(unsigned int num)   
  6. {  
  7. bool *flag=new bool[num];  
  8. unsigned int stu_num,de_num;  
  9. for(stu_num=1;stu_num<=num;stu_num++)  
  10. {  
  11. for(de_num=1;de_num<=num;de_num++)  
  12. {  
  13. if((de_num%stu_num)==0&&(de_num>stu_num))  
  14. flag[de_num-1]=!flag[de_num-1];  
  15. }  
  16. }  
  17. unsigned int k=0;  
  18. for(de_num=1;de_num<=num;de_num++)  
  19. {  
  20. if(flag[de_num-1])  
  21. k++;  
  22. }  
  23. delete []flag;  
  24. return k;  
  25. }  
  26. int _tmain(int argc, _TCHAR* argv[])  
  27. {  
  28. unsigned int n;  
  29. cin>>n;  
  30. unsigned int kk=GetLightLampNum(n);  
  31. cout<<kk;  
  32. system("pause");  
  33. return 0;  
  34. }  
0 0
原创粉丝点击