过几天就要进行华为的机试了,今儿临时抱抱佛脚,在网上找到2014届华为校招的机试题,琢磨了一会儿,贴出来记录下。
首先感谢一下Hackbuteer提供的题目:http://blog.csdn.net/hackbuteer1/article/details/11132567
对于第一题,字符过滤。最简单也是最直接的就是HASH。题目规定了输入序列只能为小写字符'a~z'。因此直接开辟一个大小为26的数组用于记录当前字符是否已经出现即可。
需要注意的问题:
1. hash数组记得初始化
2. pOutputStr为字符指针,记得在结尾‘\0’。以免*。
保险起见,可以在函数起始对pOutputStr初始化,memset(pOutputStr,0,sizeof(pOutputStr));
第二题 字符串压缩,整理题意之后,就是将连续出现的字符进行个数统计,如果大于1,则先将重复长度输出,然后将该字符输出。
需要注意的问题:
1. 某个重复字符的长度可能超过10,甚至1000,考虑itoa。
char buffer[1000];
memset(buffer,0,sizeof(buffer));
itoa(num,buffer,10);
2. 如果某字符并未重复,即个数为1,不需要在pOutputStr中输出‘1X’, 'X'--表示该字符。
3. pOutputStr 结尾。
第三题 我的思路和Hackbuteer不太一样,我的思路倾向于流程控制,写的有点冗余。
1 void setOutput(char *pOutputStr) 2 { 3 pOutputStr[0]='0'; 4 pOutputStr[1]='\0'; 5 } 6 void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr) 7 { 8 /********************************************************************** 9 *valid input string: 10 *|[left operator][left space][Operation][right space][right operator]| 11 ***********************************************************************/ 12 13 // Fnum--left operator; Fspace-- Format ensurrance 14 // Op-- operation, +/- ; 15 // Sspace-- Format ensurrance; Snum--right operator; 16 bool Fnum,Fspace,Op,Sspace,Snum; 17 Fnum=Fspace=Op=Sspace=Snum=false; 18 19 int i=0,num1=0,num2=0,mark=0; 20 char buffer[100]; 21 22 memset(pOutputStr,0,sizeof(pOutputStr)); 23 24 // get first num 25 while(i<lInputLen && pInputStr[i]>='0'&& pInputStr[i]<='9') 26 { 27 if(Fnum==false) Fnum=true; 28 num1 = num1*10 + pInputStr[i] -'0'; 29 i++; 30 } 31 if(Fnum==false || i==lInputLen) 32 { 33 setOutput(pOutputStr); 34 return; 35 } 36 //get first space 37 if(pInputStr[i]== ' ') 38 { 39 if(Fspace == false) Fspace=true; 40 i++; 41 } 42 if(Fspace==false || i==lInputLen) 43 { 44 setOutput(pOutputStr); 45 return; 46 } 47 // get operator +/- 48 if(pInputStr[i]== '+'|| pInputStr[i]=='-') 49 { 50 if(Op == false) Op=true; 51 if(pInputStr[i]=='+') mark=1; 52 else mark=2; 53 i++; 54 } 55 if(Op==false || i==lInputLen) 56 { 57 setOutput(pOutputStr); 58 return; 59 } 60 // get second space 61 if(pInputStr[i]== ' ') 62 { 63 if(Sspace == false) Sspace=true; 64 i++; 65 } 66 if(Sspace==false || i==lInputLen) 67 { 68 setOutput(pOutputStr); 69 return; 70 } 71 // get second num 72 while(i<lInputLen && pInputStr[i]>='0'&& pInputStr[i]<='9') 73 { 74 if(Snum==false) Snum=true; 75 num2 = num2*10 + pInputStr[i] -'0'; 76 i++; 77 } 78 if(Snum==false || i<lInputLen) 79 { 80 setOutput(pOutputStr); 81 return; 82 } 83 if(mark==1) num1+=num2; 84 else num1-=num2; 85 memset(buffer,0,sizeof(buffer)); 86 itoa(num1,buffer,10); 87 strcpy(pOutputStr,buffer); 88 }
转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!