华为2014机试题(一)

时间:2022-01-17 18:52:15

过几天就要进行华为的机试了,今儿临时抱抱佛脚,在网上找到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/ 谢谢!