大师兄教你如何过华为机试.docx
《大师兄教你如何过华为机试.docx》由会员分享,可在线阅读,更多相关《大师兄教你如何过华为机试.docx(20页珍藏版)》请在冰点文库上搜索。
![大师兄教你如何过华为机试.docx](https://file1.bingdoc.com/fileroot1/2023-5/20/35c06a0d-2648-4834-add1-d366f4f3a5ea/35c06a0d-2648-4834-add1-d366f4f3a5ea1.gif)
大师兄教你如何过华为机试
大师兄教你如何过华为机试
宝典1—内功心法
大华为这个大数据时代土豪金海量式的招聘又要开始了!
!
!
近期听说大华为的校招机试马上就要开始了,由于华为软件岗位的招聘只有技术面跟机试是与技术有关的内容,所以机试的地位非常重要。
对于机试,除了长期积累的软件基本功以外,还有很多可以短期训练的东西,类似于考试之前的突击,可以迅速提高机试成绩,就像在我西电大杨老师考前最后一堂课一定要去,那个重点就是考点阿。
这篇机试葵花宝典的内容是针对华为软件类上机准备的,如果你认真看了本宝典,如果
你是真正通过自己能力考上西电的话,想不过都难。
同样想拿高级题的同学,请移步或者poj.org,刷上200道题,机试不想拿满分都难。
对于机试,首先应该调整好自己的心态,不要觉得写程序很难,机试题很难,也不要去考虑,万一机试考到自己不会的内容怎么办,要相信,机试题永远是考察每个人的基础,基础是不会考的很偏的,会有人恰好做过某个题而做出来那个题,但不会有人恰好没做过一个题而做不出来那个题。
机试之前,应该做的准备有:
1、买一本《算法竞赛入门经典》,这本书不同于普通的算法或者编程语言的书籍,这本书既讲语言,又讲算法,由浅入深,讲的很好,能看完前几章并且把例题都做会,想通过机试就很简单了
2、调整好心态,时刻告诉自己,哪些小错误是自己以前经常犯的,最好用笔记本记录下来,写每道题前再看一遍,如果遇到代码调不出来了,先想想自己是否犯过以前那些错误。
还有就是,看了题目以后,先仔细想清楚细节,在纸上写清楚自己需要用到的变量,以及代码的基本框架,不要急于动手去写代码
3、不要惧怕任何一道看起来很难的题目,有不会的就去问身边会的人,让别人给自己讲清楚
4、心中默念10遍C++跟C除了多了两个加号其实没有区别,会C就能上手C++
5、大量的练习是必要且有效的
6、看完这篇宝典,预过机试、必练此功。
在这里推荐一个帖子,是机试归来的学长写的,写的很不错,里面的例题在后面的攻略中也会提及,就在好网上。
宝典二:
常用招式
1机试常用变量类型
c\c++常用的变量类型有很多种,想通过机试,掌握好其中的几种就可以,他们分别是
int,double,string,char[]
int类型是最常用的整数类型,对于输入类型是整形的变量,使用int来进行定义和读
入。
还有一种更大的整形变量是longlong,在机试中一般不会涉及到考察,如果考虑到运
算的过程中有可能超过int的大小,再考虑使用longlong,int最大可以到达2A31级别,Ionglong最大可以到达2人63。
PS:
有时机试读入多个整数的时候会是这样的形式
5,10
中间有一个逗号,在这种情况下,其实读入也是很简单的,可以这么写:
scanf(%d%c%”&a,&b,&c);
或者是:
scanf(%cf,&a);
getchar();
scanf(%d,&c);
有的机试题会说:
两个整数之间有若干个空格符或tab字符。
在这种情况下,读入的方
式还是使用scanf(%d%”&a,&b)这样,scanf函数或者cin函数都可以很好的吃掉除了数字字符以外的字符。
double类型是最常用的浮点数类型,当运算涉及到小数运算的时候,需要使用double来
定义。
其中,特别需要注意的一点是,如果使用了如下语句:
doublex=a/b;
在这里,a和b是int,那么x的值将是a和b整除后的结果,而不是想要的结果,想要得到期望的结果,须改成
doublex=(a+0.0)/b;
在这里,将a加上一个浮点数,程序会在后台将它强制转换成一个double类型的数字,
此时再除一个整数,就没有问题了
string类型是遇到字符串类问题应该首选的变量,区别于字符数组char[],string类型
是直接将字符数组封装了进去,定义strings相当于定义了一个大小特别长的字符数组。
使
用string的好处是,避免了使用char数组时定义数组长度过小导致越界,同时更加直观的将
字符串看做了一个对象。
如果要定义一个string变量,首先得包含string的头文件以及使用C++中的标准命名空间,标准命名空间这个东西,只要记得写上就行,没有任何影响。
#include//这一句是C++的头文件,c语言代码一样可以把它包含进来,只要将程序后缀名改成.cpp即可,其他都是一样的。
#include
usingnamespacestd;
在不同的环境下,可能会有不同的头文件包含了string的用法,可能的头文件有
cstring,string。
在机试的环境中,一般使用string.h即可。
定义一个string和定义其他变量方式相同:
strings;
读入和输出string也只需要使用
cin>>s;
cout<
这是比c语言的字符数组要简单了很多的。
需要注意的是,string类型读入的时候与char数组的scanf读入一样,都是遇到空格符或者回车符就停止读入,当做一个完整字符串来处理,因此,使用string处理带空格的字符
串是不明智的,其他情况下是都可以的。
string变量包含了很多强大的功能,如:
[cpp]viewplaincopyprint?
1.s[i];//这么写,返回的就是字符串s第i+1位的字符,返回的类型是char型,其中,s[0]是它的第一位,与字符串相
同。
2.s.sizeO;//返回字符串的长度,返回的长度是l,则s从s[0]到s[l-1]表示的是其每一位的字符。
3.if(s1较,每一位按照字典序来比较。
如”aaaa”<”abc”<”bcd”,但值得注意的一点是,比较的时候应用变量进行比较,即s1这种,而不能用”aa”<”bb”这样,如果要比较他俩的大小,应这么写:
4.s1="aa";s2="bb";
5.if(s1string类型还有很多强大的功能,但是对于机试来说,会使用以上三种功能就足够了。
char[50],char[100]这种字符数组与string类型很像,只不过他是C语言里面的用法,
对于机试,只建议在输入带有空格字符的字符串时使用char数组,使用的方式是:
gets(s);
在这里,gets函数区别于scanf函数的是,gets函数会直接将一整行读进来,而不会遇到空格就停下来。
常见机试题类型
初级题常见的类型无非就是字符串处理类的题目和数字处理类的题目,在这里归结如
下:
1:
字符串处理类
字符串所有大写转小写:
1.for(inti=0;i2.if(s[i]>='A'&&s[i]<='Z')
3.s[i]=s[i]-'A'+'a';
〃s[i]-'A'返回的是两个大写字母之间的差值,比如’C与'A'的差值是2,这个差值是一个
int类型,也可以直接提取出来使用。
给这个差值再加上字母'',相当于给’a'再往后推移二
位,变成字母''这种用法是字符串内最普遍的一种用法,小写转大写也是一样。
删除满足指定要求的字符后输出:
在机试中,判定对错的方式是比较输出的结果,而非检查内部的结果,因此,删除”对
于机试来说,相当于不输出”,也就是说,不需要调用s.erase()函数,只需要在遇到被删
除的字符时,跳过,不输出即可。
1.
for
(int
i=0;i2.
{
3.
if
(s[i]满足删除要求)跳过
4.
else输出s[i];
5.
}
倒转字符串:
与删除字符串的思路类似,倒转一个字符串,其实就是倒着输出,只需要将循环反过来
就可以。
1.for(inti=s.size()-1;i>=0;i--)
字符串比较大小:
如果比较的规则与字符串的比较规则相同,则直接使用s1>s2这种方式,如果规则不同,
则用一重循环按位比较即可。
2、数字处理类
数字处理类的题目,最常见的两种考察形式是整数拆分、进制转换和排序。
整数拆分是指将一个整数拆分开每一位,比如123拆分成1,2,3。
整数拆分的思路有两种,第一种是直接用字符串读入,然后把每一位用字符的形式提取出来:
还有一种思路是不断去除以10,把余数提取出来,方法是:
[cpp]viewplaincopyprint?
1.
while
(n!
=0)
2.
{
3.
style二"white-space:
pre">
num[i]=n%10;
4.
style二"white-space:
pre">
n=n/10;
5.
style二"white-space:
pre">
i++;
6.
}
进制转换:
进制转换又分为10进制转换成别的进制以及别的进制转换成10进制,进制转换其实特别
简单,只需要记住如下代码:
10进制转换成X®制
[cpp]viewplaincopyprint?
1.
while
(n!
=0)
2.
{
3.
style二"white-space:
pre">
num[i]=n%x;
4.
style二"white-space:
pre">
i++;
5.
style二"white-space:
pre">
n=n/x;
6.
}
X进制转换成10进制
[cpp]viewplaincopyprint?
1.for(inti=0;iv=length;i++)
3.ans=ans*x+num[i];
4.}
其中,num[i]表示的是该x进制数的每一位,比如一个二进制数101,用这种转换方式去
转换,ans的值从i=0到i=2处理后分别是1,2,5。
排序:
排序这个东西,其实不需要学习冒泡啊、快排啊之类的算法,应对机试,C+冲自带的
sort函数就可以很好的解决,请看下面一段代码
[cpp]viewplaincopyprint?
1.
v/pre>vprename二"code"class二"cpp">#include
2.
#include//这个是包含sort
函数的头文件
3.
usingnamespacestd;
4.
int
arr[100],n;
5.
int
cmp(intx,inty)//这个函数是sort函数比较两个元素优先级的函数,在这里计算出两个元素的优先级,然后返回
即可。
6.
{
7.
intimportance1,importance2;
8.
//此处插入代码计算x,y的重要性
9.
returnimportance1vimportance2;
//此处返回小于号,意思是优先级小的在前,如
returnx排序
10.
}
11.
int
main。
12.
{
13.
cin>>n;
14.
for(inti=0;i>arr[i];
15.
sort(arr,arr+n,cmp);
16.
return0;
17.
}
这一段代码的作用是读入n个数字,然后按优先级进行排序,排序的比较方法在cmp函数
中实现,排序的具体过程不需要考虑。
可以看到,其实只需要记住sort函数的用法,要通过机试,排序算法是根本不需要学习
的,soeasy!
总结:
机试中,掌握好int,double,string,char[],还有数组,就足够用了,但考察的内容不仅仅是上述这些,想要通过机试,还是应该多多练习,多多学习,不局限于上面
所说的内容
宝典三:
擂台实战
首先推荐一个网站:
,上面的很多题目,难度很适合机试,女口:
很简单:
1031,1120,1122,1121,1103,1104,1281,
简单:
1049,1181,1182,1279,1280,
中等:
1106,1108,1183,1288.
难:
1105,1282,1283,
大家可以根据自己的水平去训练,其实里面的难题也是很简单的,归类到题库中的话都属于简单题,只要好好看书学习都是可以做出来的,下面放几道例题,这些题都是机试很有可能考的题目,或者是非常类似的题目,已经有了仔细的注释,代码写的仓促
1.简单题
2.题目描述
3.输入一个字符串,删除其中所有的数字,所有大写字母改成小写,其他不变,并输出
4.
4.输入描述
5.一个字符串,保证没有空格,以回车符结束,字符串长度<=20
6.输出描述
7.一个字符串,为题目要求的结果
9.
8.输入样例
9.aAbB13A
10.输出样例
11.aabba
14.
12.解题思路:
模拟题目要求即可,遇到数字就跳过不输出,遇到大写字母就改成小写。
16.
13.*/
14.#includeviostream>
15.#includevstring.h>
16.usingnamespacestd;
17.intmain()
18.{
19.strings;
20.cin>>s;
21.for(inti=0;i22.{
23.if(s[i]>='0'&&s[i]<='9')continue;//遇到数字就跳过
24.if(s[i]>='A'&&s[i]v='Z')s[i]=s[i]-'A'+'a';//遇到大写字母就改成小写
25.cout<
26.}
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
coutvvendl;
}
v/span>
简单题
题目描述
输入一个字符串,统计其出现频率最高的字符,并输出。
若存在两个字符出现频率相同,则输出字典序较小的那一个
输入描述
一个字符串,保证没有空格,以回车符结束,字符串长度<=20
输出描述
一个字符
输入样例
aabbaabb
输出样例
a
解题思路:
做一个频率数组来统计所有字符的出现频率,机试时候不会有汉字输入,因此只考虑输入是ASCII编码的情况。
*/
#include
#includevstring.h>
usingnamespacestd;
intf[200];//频率数组
intbiggest=0;//记录最大的值
intmain()
{
memset(f,0,sizeof(f));//将f中的全部元素变成0,写循环也可
strings;
cin>>s;
for(inti=0;i{
intnum=s[i];//将s[i]转换成它的ascii码
f[num]++;//频率次数加1
biggest二max(biggest,f[s[i]]);//比较找出最大的
}
for(inti=0;i<=129;i++)//枚举所有的字符的频率,找出频率最高且字典序最小的那一个
if(f[i]==biggest)//如果满足要求
{
cout<<(char)(i)vbreak;//这句break保证了我们只会输出一个满足要求的结果
}
73.}
74./*
75.
简单题
76.
题目描述
77.
输入一个数字,将其倒序输出,并输出其各个位上的乘积
78.
79.
输入描述
80.
一个正整数,保证在int范围内
81.
输出描述
82.
两个数字,用空格隔幵,第一个数字为其倒序的值,第二个数字是各个位上的乘积
83.
84.
输入样例
85.
134
86.
输出样例
87.
43112
88.
89.
90.
解题思路:
删繁就简,直接当字符串读入,处理就简单多了。
91.
PS:
此处不用纠结于题意,没有特别强调是按照一个数的格式输出,因此可以有前导
0
92.
93.
*/
94.
#includeviostream>
95.
#includevstring.h>
96.
usingnamespacestd;
97.
intmain()
98.
{
99.
strings;
100.
intans=1;
101.
cin>>s;
102.
for(inti=s.size()-1;i>=0;i--)
103.
{
104.
cout<
105.
ans=ans*(s[i]-'0');//ans累乘每一位的值
106.
}
107.
coutvv''vvansvvendl;
108.
}
109.中级题
110.题目描述
111.输入10个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序
输入描述
10个正整数,保证都在int范围内,用空格隔幵
输出描述
10个数字,其从大到小的值,用空格隔开,最后一个数字后不加空格
输入样例
113245987106
输出样例
102113456789
解题思路:
调用C++自带的sort函数,重新改写compare函数即可。
*/
#includeviostream>
#includevstring.h>
#include//这个是调用sort函数必须的头文件
usingnamespacestd;
intarr[10];
intcal(intx)//计算一个数字各个位上的和
{
intans=0;
while(x!
=0)
{
ans+=x%10;
x/=10;
}
returnans;1
}
intcmp(inti,intj)
{
if(cal(i)!
=cal(j))//如果两个数字各个位上的和不相同,则按照各个位上的和来排序
{
returncal(i)vcal(j);
}
else//否则,即两个数各个位上的和相等,则按照数字本身来排序
{
returnivj;
}
}
intmain。
{
for(inti=0;i<=9;i++)cin>>arr[i];
sort(arr,arr+10,cmp);
for(inti=0;i<=9;i++)
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
{