前两天收到华为软件类实习招聘机试的通知匆匆准备了两天,今天上午上了半节曾哥的课就坐校车赶去清水河参加华为的机试了╮(╯▽╰)╭可能因为是实习招聘,题目比网上流传的要简单点,今年貌似新采取了OJ的形式来机试,但是不像OJ那么严格要限定时间和内存。有三道题,第一题60分,第二题100分,第三题160分,下面是根据我回忆写出的题目和代码:
第一题:
输入uiMin,uiMax, uiStep,输入的三个变量以逗号间隔开来,变量的类型均为unsigned int,其中uiMin <= uiMax,求表达式 x * (x + 2) +1在区间[uiMax,uiMin]中以uiStep为步长的所有和,要求必须包括uiMax和uiMin。
样例输入:1,3,1
样例输出:29
思路:这道题比较简单吧,有两个要注意的点就是:输入用逗号来间隔开,我用cin.get()来解决这个问题;还有就是要考虑最后一个x超过uiMax的时候要记得把uiMax算上来。下面是我写的代码,典型的用C++语法来写C╮(╯▽╰)╭求勿拍。。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #include<windows.h> 5 6 using namespace std; 7 8 int main() 9 { 10 unsigned int uiMin, uiMax, uiStep, ans, x; 11 cin >> uiMin; 12 cin.get(); 13 cin >> uiMax; 14 cin.get(); 15 cin >> uiStep; 16 ans = uiMin * (uiMin + 2) + 1; 17 x = uiMin + uiStep; 18 while (x < uiMax) 19 { 20 ans = ans + x * (x + 2) + 1; 21 x = x + uiStep; 22 } 23 if (x == uiMax) ans = ans + x * (x + 2) + 1; 24 else ans = ans + uiMax * (uiMax + 2) + 1; 25 cout << ans << endl; 26 system("pause"); 27 return 0; 28 }
第二题具体的题目忘了。。就是解析地址,输入一组字符串,字符串是一个数据帧,对帧内不同类型的数据进行解析,数据帧内的字符是16进制的,要求解析为10进制,分别输出T1,T2,T3,T4(忘了有多少组了==),每组所占数据帧多少个字节是已知的,好像前三组是占一个字节,后两组占两个字节,例如
输入:00010a01021030,
输出:
T1=0
T2=1
T3=10
T4=258
T5= 4144
(大概是这样吧。。忘了有多少组了。。输出的名称也不是Tn。。)
这道题的思路也挺容易想出的就是把字符串放到一个数组里,然后用sscanf()函数打印到另一个数组里面然后就可以处理了。。当时做完第一题后感觉剩下时间只能做一题了,因为第三题分比较高做了第三题,第二题就没时间做了。。回来具体题目也忘了,所以就懒得写了。。
第三题:矩阵构造
输入一个整数n,构造一个n*n矩阵的上三角矩阵,对该矩阵从1开始顺时针递增填数。,输出格式为左对齐4位。
样例输入:
5
样例输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
思路:这道题就是刘汝佳白书上那道蛇形填数的例题的变形,构造一个二维数组,然后需要判断边界,具体请参考白书。。一下是我的代码:
1 #include<iostream>
3 #include<cstring>
4 #include<windows.h>
5
6 using namespace std;
7
8 int main()
9 {
10 int a[50][50];
11 int n, i, j, tot;
12 cin >> n;
13 memset(a, 0, sizeof(a));
14 tot = a[i = 0][j = 0] = 1;
15 while(tot < ((n * n) / 2 + 2) )
16 {
17 while((j + 1) < n && a[i][j + 1] == 0) a[i][++j] = ++tot;
18 while((i + 1) < n && a[i + 1][j - 1] == 0) a[++i][--j] = ++tot;
19 while((i - 1) >= 0 && a[i - 1][j] == 0) a[--i][j] = ++tot;
20 }
21 for(i = 0; i < n; i++)
22 {
23 for(j = 0; j < n; j++)
24 {
25 if(a[i][j] == 0)
26 {
27
28 break;
29 }
30 printf("%-4d", a[i][j]);
31 }
32 cout << endl;
33 }
34
35 system("pause");
36 return 0;
37 }
我觉得代码没什么问题,但是提交上去返回信息是答案基本正确,格式错误,我也不知道哪里出了问题o(╯□╰)o
华为的效率很高。。因为昨天下午接到通知说今天就要面试了。。所以昨天没有更新。。收到短信说是2点面试,为了避免机试时差点迟到的杯具我12点多就去到成研所了。去到那里发现来面试的基本都是研究生。。压力好大。。 先是做了大半个小时坑爹的性格测试(同样坑爹的是机子里的输入法同样打不出我的名字。。)做完性格测试等了一会就被叫去技术面了。先是让我自我介绍一下,然后介绍一下我做的项目,我做的是模糊图像处理方面的,面试官估计对这个不是很懂。。我就在那balabala讲了一堆。。讲的面试官云里雾里的,估计他也不是听得很懂。。(我的表达能力是硬伤==)然后面试官就问了我一些常见的问题:用过malloc函数吧,说说它是怎么分配内存的,这个我刚好昨晚看了一下,就balabala讲了一堆。接着又问了c跟c++的区别,我才刚开始看c++啊。。就随口说c是面向过程,c++是面向对象的,然后杯具就来了。。面试官就抓住面向对象猛问,估计是正好碰上他枪口了,还叫我画了个类图什么的。。我这些设计模式啊什么的都没了解过啊。。就乱画了个类图出来。。然后又问了个好像也是机试的题目吧,不过不是我考的那三道之一,就是字符串压缩问题,我一看这不是跟那道往年的华为机试题差不多的么!我前几天有做过啊,还写了代码出来的呢!但是现场让我手写代码就写不出来了啊。。只是把思路跟面试官说了一下。最后面试官跟我说你的算法能力还不错,你做的那个项目也是研究算法的,但是我们招的是软开,你回去还是去找一些开源项目来做做,做出一个真正的软件出来吧。 就这样被赤果果的BS了o(︶︿︶)o唉
回来的感受就是自己的实际工程经验还是太少,还有基础什么的完全比不过大计院的啊。。回去还是好好啃设计模式,好好啃C++,多做些实际项目才是王道!加油!共勉!