华为机试一霸教你过华为机试Word文件下载.docx
- 文档编号:4978560
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:27
- 大小:27.39KB
华为机试一霸教你过华为机试Word文件下载.docx
《华为机试一霸教你过华为机试Word文件下载.docx》由会员分享,可在线阅读,更多相关《华为机试一霸教你过华为机试Word文件下载.docx(27页珍藏版)》请在冰点文库上搜索。
string类型是遇到字符串类问题应该首选的变量,区别于字符数组char[],string类型是直接将字符数组封装了进去,定义strings相当于定义了一个大小特别长的字符数组。
使用string的好处是,避免了使用char数组时定义数组长度过小导致越界,同时更加直观的将字符串看做了一个对象。
如果要定义一个string变量,首先得包含string的头文件以及使用C++中的标准命名空间,标准命名空间这个东西,只要记得写上就行,没有任何影响。
#include<
iostream>
pp即可,其他都是一样的。
>
usingnamespacestd;
在不同的环境下,可能会有不同的头文件包含了string的用法,可能的头文件有cstring,string。
在机试的环境中,一般使用即可。
定义一个string和定义其他变量方式相同:
strings;
读入和输出string也只需要使用
cin>
s;
cout<
<
这是比c语言的字符数组要简单了很多的。
需要注意的是,string类型读入的时候与char数组的scanf读入一样,都是遇到空格符或者回车符就停止读入,当做一个完整字符串来处理,因此,使用string处理带空格的字符串是不明智的,其他情况下是都可以的。
string变量包含了很多强大的功能,如:
[cpp]viewplaincopyprint
1.s[i];
();
if(s1<
s2)s1="
aa"
;
s2="
bb"
5.if(s1<
s2)
string类型还有很多强大的功能,但是对于机试来说,会使用以上三种功能就足够了。
char[50],char[100]这种字符数组与string类型很像,只不过他是C语言里面的用法,对于机试,只建议在输入带有空格字符的字符串时使用char数组,使用的方式是:
gets(s);
在这里,gets函数区别于scanf函数的是,gets函数会直接将一整行读进来,而不会遇到空格就停下来。
常见机试题类型
初级题常见的类型无非就是字符串处理类的题目和数字处理类的题目,在这里归结如下:
字符串处理类
字符串所有大写转小写:
1.for(inti=0;
i<
();
i++)
2.if(s[i]>
=’A’&
&
s[i]<
=’Z’)
3.s[i]=s[i]-’A’+’a’;
for(inti=0;
2.{
3.if(s[i]满足删除要求)跳过;
4.else输出s[i];
5.}
倒转字符串:
与删除字符串的思路类似,倒转一个字符串,其实就是倒着输出,只需要将循环反过来就可以。
1.for(inti=()-1;
i>
=0;
i--)
字符串比较大小:
如果比较的规则与字符串的比较规则相同,则直接使用s1>
s2这种方式,如果规则不同,则用一重循环按位比较即可。
2、数字处理类
数字处理类的题目,最常见的两种考察形式是整数拆分、进制转换和排序。
整数拆分是指将一个整数拆分开每一位,比如123拆分成1,2,3。
整数拆分的思路有两种,第一种是直接用字符串读入,然后把每一位用字符的形式提取出来:
2.<
spanstyle="
white-space:
pre"
<
/span>
num[i]=s[i]-'
0'
还有一种思路是不断去除以10,把余数提取出来,方法是:
1.while(n!
=0)
3.<
num[i]=n%10;
4.<
n=n/10;
5.<
i++;
6.}
进制转换:
进制转换又分为10进制转换成别的进制以及别的进制转换成10进制,进制转换其实特别简单,只需要记住如下代码:
10进制转换成X进制
num[i]=n%x;
n=n/x;
X进制转换成10进制
=length;
3.ans=ans*x+num[i];
4.}
其中,num[i]表示的是该x进制数的每一位,比如一个二进制数101,用这种转换方式去转换,ans的值从i=0到i=2处理后分别是1,2,5。
排序:
排序这个东西,其实不需要学习冒泡啊、快排啊之类的算法,应对机试,C++中自带的sort函数就可以很好的解决,请看下面一段代码
1.<
/pre>
prename="
code"
class="
cpp"
2.#include<
algorithm>
usingnamespacestd;
4.intarr[100],n;
5.intcmp(intx,inty){
7.intimportance1,importance2;
8.returnimportance1<
importance2;
}
11.intmain()
12.{
13.cin>
n;
14.for(inti=0;
i++)cin>
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.
5.输入描述
6.一个字符串,保证没有空格,以回车符结束,字符串长度<
=20
7.输出描述
8.一个字符串,为题目要求的结果
9.
10.输入样例
11.aAbB13A
12.输出样例
13.aabba
14.
15.解题思路:
模拟题目要求即可,遇到数字就跳过不输出,遇到大写字母就改成小写。
16.
17.*/
18.#include<
19.#include<
20.usingnamespacestd;
21.intmain()
22.{
23.strings;
24.cin>
25.for(inti=0;
i++){
27.if(s[i]>
='
&
9'
)continue;
if(s[i]>
A'
Z'
)s[i]=s[i]-'
+'
a'
cout<
s[i];
30.}
31.cout<
endl;
32.}
33.<
34.简单题
35.题目描述
36.输入一个字符串,统计其出现频率最高的字符,并输出。
若存在两个字符出现频率相同,则输出字典序较小的那一个
37.
38.输入描述
39.一个字符串,保证没有空格,以回车符结束,字符串长度<
40.输出描述
41.一个字符
42.
43.输入样例
44.aabbaabb
45.输出样例
46.a
47.
48.解题思路:
做一个频率数组来统计所有字符的出现频率,机试时候不会有汉字输入,因此只考虑输入是ASCII编码的情况。
49.
50.*/
51.#include<
52.#include<
53.usingnamespacestd;
54.intf[200];
intbiggest=0;
intmain()
57.{
58.memset(f,0,sizeof(f));
strings;
60.cin>
61.for(inti=0;
63.intnum=s[i];
f[num]++;
biggest=max(biggest,f[s[i]]);
67.for(inti=0;
=129;
i++)if(f[i]==biggest){
70.cout<
(char)(i)<
71.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.#include<
95.#include<
96.usingnamespacestd;
97.intmain()
98.{
99.strings;
100.intans=1;
101.cin>
102.for(inti=()-1;
103.{
104.cout<
ans=ans*(s[i]-'
);
107.cout<
'
'
ans<
108.}
109.中级题
110.题目描述
111.输入10个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大排序。
112.
113.输入描述
114.10个正整数,保证都在int范围内,用空格隔开
115.输出描述
116.10个数字,其从大到小的值,用空格隔开,最后一个数字后不加空格
117.
118.输入样例
119.113245987106
120.输出样例
121.102113456789
122.
123.解题思路:
调用C++自带的sort函数,重新改写compare函数即可。
124.*/
125.#include<
126.#include<
127.#include<
129.intarr[10];
130.intcal(intx){
132.intans=0;
133.while(x!
134.{
135.ans+=x%10;
136.x/=10;
137.}
138.returnans;
1
139.}
140.intcmp(inti,intj)
141.{
142.if(cal(i)!
=cal(j)){
144.returncal(i)<
cal(j);
145.}
146.else{
148.returni<
j;
149.}
150.}
151.intmain()
152.{
153.for(inti=0;
=9;
154.sort(arr,arr+10,cmp);
155.for(inti=0;
156.{
157.cout<
158.if(i!
=9)cout<
160.cout<
161.}
163.中级题
164.题目描述
165.你有一个容量为100的箩筐,给你30个物品,每个物品的体积已知问:
最多能装多少个物品进箩筐
166.输入描述
167.一行30个正整数,用空格隔开,表示每个物品的体积
168.输出描述
169.一个数字,为最多能装下的物品数
170.
171.输入样例(此处用3个物品作为样例,实际读入为30个)
172.559100
173.输出样例
174.2
175.
176.解题思路:
利用性价比对所有物品进行排序,优先装性价比高的,在此题中,性价比就是物品的体积
177.*/
178.#include<
179.#include<
180.#include<
182.intarr[31];
183.intmain()
184.{
185.for(inti=0;
=29;
186.sort(arr,arr+30);
intsum=0;
189.for(inti=0;
190.{
191.if(sum+arr[i]>
100)break;
sum=sum+arr[i];
194.cout<
196.}
197.初级题:
(此题是我曾经做的机试题)
198.描述:
10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
199.
(1)及格线是10的倍数;
200.
(2)保证至少有60%的学生及格;
201.(3)如果所有的学生都高于60分,则及格线为60分
202.(4)及格线越高越好,但最高不能超过60
203.输入:
输入10个整数,取值0~100
204.输出:
输出及格线,10的倍数
205.输入样例:
61514930201070809099
206.输出样例:
50
207.
208.解题思路:
从高到低枚举及格线,输出第一个满足要求的及格线就是答案
209.*/
210.#include<
211.usingnamespacestd;
212.intarr[10];
213.intmain()
214.{
215.for(inti=0;
216.intline;
217.for(line=60;
line>
line-=10){
219.intnum=0;
for(inti=0;
221.if(arr[i]>
=line)num++;
223.if(num>
=6)break;
226.cout<
line<
227.}
228.中级题:
100分(此题是我曾经做的机试题)
229.描述:
一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1、2、3、…n-1、n。
每盏电灯由一个拉线开关控制。
开始,电灯全部关着。
230.有n个学生从长廊穿过。
第一个学生把号码凡是1的倍数的电灯的开关拉一下;
接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;
接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;
如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:
电灯数和学生数一致。
231.
232.输入:
电灯的数量
233.输出:
亮着的电灯数量
234.样例输入:
3
235.样例输出:
236.
237.解题思路1:
这道题,如果要模拟的话,当然是可以的,但对于代码基础较差的同学写起来就比较吃力了,在这里写模拟的做法
238.解题思路2:
在这道题上面多思考思考,可以看出,对于任何一个灯来说,比如12,其因数有1,2,3,4,6,12。
说明,编号为1,2,3,4,6,12的学生分别要拉它一下,在这里发现,1*12=12,2*6=12,3*4=12,所以其因数都是一一对应的,也就是,1拉的那一下被12抵消了,2拉的那一下被6抵消了,那么谁不会被抵消呢答案是平方数,比如9的因数是1,3,9,那么3*3=9,而3只拉一次,所以不会被抵消。
因此,这道题的答案就是,输入的n以内的平方数个数,等于(int)sqrt(n)。
239.从这道题可以看出,编程的很多时候,多思考比多动笔要有用的多。
240.
241.*/
242.#include<
243.#include<
244.usingnamespacestd;
245.intvis[65536],n;
246.intmain()
247.{
248.cin>
249.memset(vis,0,sizeof(vis));
for(inti=1;
=n;
i++)for(intj=i;
j<
j+=i).,这些灯全部都被拉一次开关
252.vis[j]=1-vis[j];
intans=0;
255.if(vis[i]==1)ans++;
257.cout<
}
上面的所有代码能够看懂,并且自己实现一遍,再练上几个类似的题,过机试肯定没问题,能够轻松写出上面的代码,那么机试优秀肯定没问
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 机试一霸教