华为机试成功归来,与小伙伴们分享下经验

黎明曙光


前段时间参加华为机试,机试通过的可以优先录取,优先选择岗位和工作地,关键是面的好,还可以谈更高的工资,最多在西安可以拿到18W。好处还是蛮多的,抱着试试看的态度就去了。哈哈,华为机试记录正式开始。


提前在网上交了简历,周围同学只要报了软件研发类的相关岗位都收到短信通知,需要用到编程的同学基本上都收到短信了。一天三波,在西工大毅字楼三楼机房,南门进去直走左拐就到了,我是第二天早上的机试,前一天已经听机试过的同学考的内容涉及数组、链表、指针、字符串、循环、枚举、排序等吧,这个估计要看人品,平时出门多扶老奶奶过马路吧。其实考过后发现这个机试跟平时做项目不一样,项目可能更多的注重实现研究所需要的某个功能不会去注意这么多细节,但是机试考的更多的是基本功。下面重点跟大家分享下上机题吧,我只列举了我抽到的三个,其他同学抽到的跟这个大同小异吧。大家自己编写下,对即将开始的面试都会有帮助的。


考试内容:数组、链表、指针、字符串、循环、枚举、排序等(从考过的同学那儿总结的可能不全)


试题结构:考试总共三道题,说是难中易,初级题(60分)、中级题(100分)、高级题(160分),最难的接近一百行,说多不多,但自己敲出来还是费了点劲,


考试时间:两个小时。平时练得少可能稍微捉鸡点。


最简单的一个


描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 
及格线是10的倍数;
(2) 
保证至少有60%的学生及格;
(3) 
如果所有的学生都高于60分,则及格线为60


 


 


输入:输入10个整数,取值0~100


输出:输出及格线,10的倍数


输入样例:61 51 49 30
20 10 70 80 90 99


输出样例:50


自己编写代码简单如下:



1.       #include <stdio.h>   


2.         


3.         


4.       void bubbleSort(int arr[])    


5.       {     
  


6.           int i = 0;   


7.           int j = 0;   


8.           int t = 0;   


9.         


10.       for(i = 0;i < 10; i++)   


11.       {         
  


12.           for(j = 0; j < (9 - i); j++)
  


13.           {             
  


14.               if(arr[j + 1] < arr[j])   


15.               {               
  


16.                   t = arr[j + 1];
  


17.                   arr[j + 1] = arr[j]; 
  


18.                   arr[j] = t;
  


19.               }
  


20.           }   


21.       }   


22.   }   


23.     


24.   int getPassLine(int a[])   


25.   {   


26.       int i = 0;   


27.          


28.       bubbleSort(a);   


29.          


30.       if (a[0] >= 60)   


31.       {   


32.           return 60;   


33.       }   


34.       else  


35.       {   


36.           return ((a[4] / 10) * 10);   


37.       }   


38.     


39.   }   


40.     


41.     


42.     


43.   int main()   


44.   {   


45.       int a[10] = {0};   


46.     


47.       scanf("%d %d %d %d %d %d %d %d %d %d", &a[0],  &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
  


48.          


49.       printf("%d", getPassLine(a));   


50.          


51.     return 0;   


52.   }  



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


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


 


输入:电灯的数量


输出:亮着的电灯数量


样例输入:3


样例输出:1


 


答案参考:



1.       #include <stdio.h>   


2.         


3.       #define  MAX_BULB_NUM 65535   


4.       /*  


5.       功能: n个学生按规定走完后,长廊里电灯有几盏亮着。  


6.       原型:  


7.           int GetLightLampNum(int n);  


8.        


9.       输入参数:  


10.       int n: 电灯/学生的数量。  


11.    


12.   返回值:  


13.       int: 亮着的电灯数量。  


14.    


15.   */  


16.     


17.   int GetLightLampNum(int n)   


18.   {   


19.       char Bulb_Flag[MAX_BULB_NUM] = {0};    //0代表灯灭,1代表灯亮   


20.       unsigned int i;   


21.       unsigned int j = 1;   


22.       unsigned int Count = 0;   


23.          


24.       if ((n < 1)||(n > 65535))
  


25.       {   


26.           return false;   


27.       }   


28.     


29.       while ( j <= n)   


30.       {   


31.           for (int i = 1; i <= n; i++)
  


32.           {   


33.               if (0 == (i%j))   


34.               {
  


35.                   Bulb_Flag[i-1] += 1;
  


36.                   Bulb_Flag[i-1] = Bulb_Flag[i-1]%2 ;   //if操作用来反转满足条件的灯泡状态   


37.               }
  


38.           }   


39.           j++;   


40.       }   


41.     


42.       for (i = 0; i < MAX_BULB_NUM; i++)
  


43.       {   


44.           if (1 == Bulb_Flag)   


45.           {   


46.               Count++;
  


47.           }   


48.       }   


49.     


50.       return Count;   


51.   }   


52.     


53.   int main(void)   


54.   {   


55.       int input;   


56.       scanf("%d",&input);   


57.       printf("%d",GetLightLampNum(input));   


58.   }  



 


高级题样题:地铁换乘 


描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1
 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18
地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15


 


输入:输入两个不同的站名


输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次


输入样例:A1 A3


输出样例:3


 


答案参考:



1.       import java.util.*;   


2.         


3.         


4.       public class Main {   


5.           
  


6.           private static int INVALID_POSITION = 255;   


7.           
  


8.           class BusLine {   


9.               String busstop[];
  


10.           String lineName;
  


11.              


12.           public BusLine(String line) {   


13.               String[] stops = line.split(" ");   


14.               this.busstop = new String[stops.length];
  


15.               for (int i = 0; i < stops.length; i++) {
  


16.                   this.busstop = stops;   


17.                   lineName = stops[< span>0< span>].substring(01);   


18.               }               
  


19.           }   


20.              


21.           /* get the stop position from the line */  


22.           int getStopPosition (String point) {   


23.               for (int i = 0; i < busstop.length; i++) {
  


24.                   if (busstop.equals(point)) {   


25.                       return i;   


26.                   }
  


27.               }
  


28.               return INVALID_POSITION;        
  


29.           }   


30.              


31.           int getDistance(String pointA, String pointB) {
  


32.               int positionA = 0;   


33.               int positionB = 0;   


34.               int len = 0;   


35.               
  


36.               positionA = getStopPosition(pointA);
  


37.               positionB = getStopPosition(pointB);
  


38.               
  


39.               if (positionA != INVALID_POSITION && positionB != INVALID_POSITION) {
  


40.                   len = Math.abs(positionA - positionB) + 1;   


41.                   if (lineName.equals("A") && len > (busstop.length - len + 2)) {   


42.                       len =  (busstop.length - len + 2);   


43.                   }
  


44.                   
  


45.                   return len;   


46.               }
  


47.     


48.               return INVALID_POSITION;   


49.           }   


50.              


51.       }   


52.          


53.          


54.       public int getRide(String pointA, String pointB) {
  


55.           int i = 0;   


56.           int min = 255;   


57.           BusLine lineA = new BusLine("A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18");   


58.           BusLine lineB = new BusLine("B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15");   


59.     


60.           int[] way = {255255255255255255255255};   


61.              


62.           way[< span>0< span>] =  lineA.getDistance(pointA, pointB);
  


63.           way[< span>1< span>] =  lineB.getDistance(pointA, pointB);
  


64.              


65.           way[< span>2< span>] =  lineA.getDistance(pointA, "T1") + lineB.getDistance(pointB, "T1") - 1;   


66.           way[< span>3< span>] =  lineB.getDistance(pointA, "T1") + lineA.getDistance(pointB, "T1") - 1;   


67.              


68.           way[< span>4< span>] =  lineA.getDistance(pointA, "T2") + lineB.getDistance(pointB, "T2") - 1;   


69.           way[< span>5< span>] =  lineB.getDistance(pointA, "T2") + lineA.getDistance(pointB, "T2") - 1;   


70.              


71.           way[< span>6< span>] =  lineB.getDistance(pointA, "T1") + lineB.getDistance(pointB, "T2") + lineA.getDistance("T1""T2") - 2;   


72.           way[< span>7< span>] =  lineB.getDistance(pointA, "T2") + lineB.getDistance(pointB, "T1") + lineA.getDistance("T1""T2") - 2;   


73.                   
  


74.           for (i = 0; i < 7; i++) {   


75.               if (min > way) {   


76.                   min = way;
  


77.               }
  


78.           }   


79.              


80.           return min;        


81.       }   


82.          


83.       public static void main(String[] args) {   


84.           Main m = new Main();   


85.           Scanner cin = new Scanner(System.in);   


86.           String inputStr = cin.nextLine();
  


87.           String stops[] = inputStr.split(" ");   


88.              


89.           System.out.println(m.getRide(stops[< span>0< span>], stops[< span>1< span>]));   


90.       }   


91.     


92.   }  



 


 


其实后来发现整个过程下来还是有点紧张的。数组、链表、指针、字符串、循环、枚举、排序等内容基本上都考察到了。大家借鉴下吧。我的难度比其他同学难度大了些,最后一个当时没测试通过,回来才调过。做对了两道。加油吧,毕业季里相互分享下资料,互惠互利

戒网废号密码随机
bubbleSort里边为啥要循环10次, 我觉得循环6次就行了啊
非计算机专业的想法, 是不是不靠谱

android
请问LZ这个消息哪里来的啊?
黎明曙光 #1
最多在西安可以拿到 18W
Bro
这个难度的编程就可以拿到18W了
小李一号
18W?博士吧。。。

有时半夜醒来,想到囤里有米、橱里有衣,总算像家人家了,就乐不思蜀睡不着,禁不住要把老婆推醒了陪他聊天讲闲话。
玫瑰花匠
恭喜恭喜

你只负责努力精彩,上天自有他的安排。——希望遇到不可预知的自己!
Solaris
好吧,现在确实如此。 10K每月,已经找不到会写递归的码农了。

ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็
明夷
记得华为给本科都有给到18w以上的,再说这三道题也不难,就是校园招聘的题,楼上诸位至于嘛,华为通信设备商全球数一数二,这点钱拿不出来?

xuejita
感谢分享

邀请您访问国防科技论坛
http://bbs.81tech.com/?fromuid=673879
jasonz
m

做一个徘徊于牛A与牛C间的人
黎明曙光
面试时与高管聊天得来的,看自己造化了
android #6
请问LZ这个消息哪里来的啊?
小鱼123
MARK!

做个合格的研究僧~~
倾斜45度的冰
M

谢一生能以朋友的身份相遇,以知己的身份忘记~~~~~~~~
江山依旧
MARK

既然选择了地平线,那么留给世界的就只能是背影。
I..MīSS ㄚ&#242;ひ..........
LZ是高手

*风未停 爱无止 风未止 恋相随* ~~~~等到风景都看透 也许 你会陪我看细水常流~~~~
天是蓝的,海是深的,想你是真的,嫁给你是不可能的,如果你是有钱的,也许我们还是有缘的 ##¥~1
胃小饱
膜拜

高帅富狂升硬件,矮挫穷死改算法
江湖小范
mark

这个世界什么最多?人最多。这个世界什么最少?你最少!
荧惑守心
呵呵,现在码农要求好低啊,这三题难度不及高中信心学奥林匹克
Solaris #12
好吧,现在确实如此。 10K每月,已经找不到会写递归的码农了。

爱来绿色建筑网http://www.archlib.com
收集绿色建筑,生态建筑,可持续建筑,绿色建筑资料图片规范实例的专业技术网站
在西工大第七年,学了点皮毛
专业翻新核弹头,潜艇抛光,回收二手航母,大修核反应堆,航天飞机保养.高空擦洗卫星积尘
Solaris
荧惑守心 #25
呵呵,现在码农要求好低啊,这三题难度不及高中信心学奥林匹克
其实,高中信息奥利匹克能力+3年以上工作经验+能说人话,一般开价在20K以上. 或者英语好些,干脆都去国外了

ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็
飞行器123
第二题开个平方向下取整就行了吧,没必要走一遍啊。
南浦结
m

................................................................
明夷
唉,时代确实不同了,我当时小学初中上课,学校就是教logo,WPS(当时WPS比office火多了),win3.5,VB,flash什么的。
现在表妹学校是直接上竞赛了,才初中,只不过是用pascal,不感兴趣的也不强求。
高中时候班里计算机课代表我们省计算机竞赛一等奖,大学没毕业就去欧洲读了,现在过得比我等土逼强多了。
国内的本科牛人也能拿到20k+。我当时刚来实习时候知道的。
Solaris #26
其实,高中信息奥利匹克能力+3年以上工作经验+能说人话,一般开价在20K以上. 或者英语好些,干脆都去国外了

傲天印叶
原来是这样,后悔没学计算机
传说狠
mark

北大教授健康讲座(看完后保证你能多活十年)http://v.youku.com/v_show/id_XMTIxNzM3MTY=.html
Solaris
傲天印叶 #31
原来是这样,后悔没学计算机
需求相对比较大,靠谱的码农相对少.

ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็
余兴节目(独家)
其实这种题在华为呆3个月做150道oj题,是个人都会做

传说狠
顶~

北大教授健康讲座(看完后保证你能多活十年)http://v.youku.com/v_show/id_XMTIxNzM3MTY=.html
紅錵會-輝輝
卧槽,这也要2个小时啊,最耗时的大约就是变量命名了吧。

他年他月她又在何方?
默语@
为什么没人说第一题题目不严谨 是我理解有问题么 至少60%及格 如果有60分以下的 及格线10满足要求吧

人的一生问一问能有几天? 人的一生算一算不过三天: 跑过去的是昨天,奔过来的是明天,正在走的是今天。 不要忘记昨天,认真想想明天,好好把握今天。 但愿到了明天,今天已成昨天,你依然在我身边。 春梦无痕,秋夜缠绵,如歌岁月,似水流年。 但愿到了明天,今天已成昨天,我依然在您心间。