从网上整理的华为机试题目Word下载.docx
《从网上整理的华为机试题目Word下载.docx》由会员分享,可在线阅读,更多相关《从网上整理的华为机试题目Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
7.
string
str;
8.
int
a[128]={0};
9.
while
(cin
>
str){
10.
for(int
i=0;
i<
();
i++){
11.
a[str[i]]++;
}
....位。
我不放心,输出测试一下。
之后就简单了,输出a数组中从小到大第一个值为1的i值即可。
值得注意的是,这种题其实写在一个main函数里就够了,而且这样写也比较好。
毕竟机试不是做项目,不需要模块化,这样修改起来也比较容易。
题目二、
宝宝表示这道题其实不难,就是两个字,复杂。
我的思路大概就是
1.首先判断所给矩形是否相交,不相交直接输出0
2.若相交,将相交面积表示出来,并输出结果
最后发现貌似判断相交的思路会影响相交求面积的思路(正所谓数学题多问,第一问为第二问做铺垫一样)由于我的判相交思路不好影响了第二问,导致这一题我没做出来。
思路大概是求出两个矩形中心坐标,用平行于坐标轴的线段连接两个中心,平行于x轴的线段长度若记为cenX,另一个记为cenY,我就判断cenX,Y与两矩形边长的关系。
做完后才发现对第二问毫无帮助,炸了。
。
浴室这一题200分我得了不到100分。
(没代码)
题目三、
这道题其实没怎么做出来,就不好说什么。
下面是这道题正解的源码:
#include<
stack>
usingnamespacestd;
intnum[400][400];
intlen[400][400];
intmax(inta,intb)
{
if(a>
b)
returna;
else
returnb;
}
intmain()
intm,n;
scanf("
%d%d"
&
m,&
n);
for(inti=1;
=m;
i++)
{
len[i][0]=0;
for(intj=1;
j<
=n;
j++)
len[0][j]=-1;
%d"
num[i][j]);
if(num[i][j])len[i][j]=len[i][j-1]+num[i][j];
elselen[i][j]=0;
}
stack<
int>
S;
intans=0,tmp;
for(intj=n;
j>
0;
j--)
intW,L;
tmp=0;
if(ans>
=j*m)
break;
(0);
if(len[i][j]>
len[()][j]){(i);
while(!
()&
&
len[i][j]<
=len[()][j])
L=();
();
intp=();
W=(i-p-1);
tmp=max(tmp,W*len[L][j]);
(i);
intLL;
if(!
())LL=();
())
if(p)W=(LL-p);
else{W=LL;
ans=max(tmp,ans);
printf("
%d\n"
ans);
return0;
三.华为挑战赛(也是模拟机试)
题目一、
这种第一题摆明了是送分题,不好说什么,有一点编程底子的10分钟内都能做出来
inti,j;
inttemp;
boolflag;
cin>
m>
n;
for(i=m;
flag=true;
;
temp=(int)sqrt(i);
for(j=2;
=temp;
if(i%j==0)
flag=false;
if(flag==true)
cout<
"
"
卧槽,这道题我要吐槽。
因为一些原因和问题,导致这道题占用了我整个考试3/4多的时间,这也明显是我的不足,此处进行自我检讨和总结。
Point:
输入输出(这里是我的薄弱项!
)
这也是这道题最主要的内容和考察点。
其实题目本身算法不难,对输入的每一个数,遍历输入的每一个数,统计被整除的次数count,只要count>
=2就是结果输出。
那么接下来问题来了:
1.计算机如何接受这些输入,因为有要求以“,”为分隔符
因为有“,”,作为字符存在,又不限制输入的具体个数,所以无法用int数组接收这些输入,此处应选择C++字符串stringstr;
作为接收输入。
那么很明显,本题对C++字符串是一个考察点,并且考察重要程度甚至大于这道题的算法本身。
2.如何在一个str中取得这些数字
毫无疑问考察应试者的字符串处理能力。
我先想的是以逗号为分隔符,由于C++字符串可以以下标取出值(如str[i]),取得每一个逗号的位置,后一个减前一个得到中间的数字。
然后发现()函数会连逗号一起取出,所以这不是一个可取的方法,更不是一个好方法。
好的处理方法应该是这样,如下:
chara[10];
intp=0;
intnum[N];
inti,j,cnt=0;
[cpp]viewplaincopy
spanstyle="
white-space:
pre"
<
/span>
cin>
for(i=0;
++i)写字母转成下一位大写字母,如A转成B,特例为Z转成A
2.小写字母类似
3.对数字做如下转换:
偶数减2,特例0转成8;
奇数加1,特例9转成0.
第二题
算麻将的番数:
规则如下:
1.有条和饼两副牌,使用T与O表示,1T代表1条
2.其中出现1条2条3条连着则加1番
3.出现4个一样的牌则代表杠,加两番
连对则加4番
输入规则:
输入者保证牌数已经胡了,格式例如"
1T2T3T,4O5O6O,3T4T5T,5O6O7O,7T7T."
.中间使用“,”逗号隔开,结尾是句点。
输出规则:
输出一个整型值代表番数。
第三题
找出一篇文章中单词出现频率最高的前两位(不分并列情况):
文章字符串规则如下:
1.文章单词使用空格、句点与逗号分隔
2.全部转成小写字母
考后感
题目分数:
第一道60分;
第二道100分;
第三道160分;
自己做对了前两道,160分吧,一般。
最后一题只剩10分钟了,也没去做了。
感谢
非常感谢华为(尤其是刘茜,我不知道她是谁),之前本来第一次笔试我回短信就已经晚了,而且第二天有因为非常紧急的事情又不能去了,只能表示歉意。
谁知还给自己一次机试的机会。
在此对这种负责的精神表示崇高的敬意!
!
七.2016机试题目
实现语言:
C++题目简单,没有涉及太多的算法,就是一些输入输出的格式需要注意
题目一
描述
根据指定的分隔符分隔字符串,并输出指定的段。
如果指定的段超过分隔的段数,输出:
NULL
举例:
AAA?
BBB?
CCC?
?
2
字符串为:
分隔符为:
?
指定的段为:
字符串分割为:
AAABBBCCC共三段,第2段字符串为:
BBB
输入输出格式要求
输入分隔字符串长度小于128个字符,指定的段是一个正整数。
样例
输入:
输出:
实现代码如下:
#include<
typeinfo>
cctype>
intgetNum(stringinpus)
{
intobjNum=0,t=1;
for(longi=()-1;
i>
=0;
--i){
if(isdigit(inpus[i])&
inpus[i]!
='
'
){
objNum+=(inpus[i]-'
0'
)*t;
t*=10;
}else{
}
returnobjNum;
}
intmain(intargc,constchar*argv[]){
stringinpus;
cin>
inpus;
vector<
string>
objStringInfo;
stringa="
for(inti=0;
i<
++i){
if(inpus[i]=='
||i==()){
(a);
a="
else{
a+=inpus[i];
cout<
objStringInfo[getNum(inpus)-1]<
endl;
运行结果:
题目一.png
题目二
输入一组大于0小于1000的整数,且均不相同,逗号隔开,输出其中能被这些整数中其他元素整除的那些元素。
输入要求同上述描述,输出要求整数顺序按照输入时的顺序输出。
2,4,6,8,10,12,3,9
4,6,8,10,12,9
代码如下:
intgetStringNum(stringinpus)
vector<
getNum(stringinputs)
v;
num;
stringbuff="
i<
=();
if(i==()-1){
buff=inputs[()-1];
(buff);
buff="
if(inputs[i]=='
'
}else{
buff+=inputs[i];
++i){
(getStringNum(v[i]));
returnnum;
strings;
s;
array=getNum(s);
intk=0,result[100]={0};
for(intj=0;
j<
++j){
if(array[i]%array[j]==0&
array[i]!
=array[j])
{
result[k]=array[i];
k++;
k;
++i)
if(i!
=k-1)
result[i]<
"
else
题目三
描述:
大数求余
输入两个超长整型构成的字符串,使用空格隔开,求前者除以后者的余数。
输入的每个字符串最大长度为100个字符,输出为余数值,如果结果异常输出NULL
9
6172844
主要涉及大数问题,A对B取模,即除法运算,可以利用高精度减法解决,前期想的时候细节上可能会有问题,需要注意减法过程中对符号的处理
代码如下:
stringsubtraction(stringa,stringb)//大数减法
intarr1[100]={0},arr2[100]={0},arr3[100]={0};
for(longi=()-1,k=0;
i>
=0;
--i){
arr1[k++]=a[i]-'
arr2[k++]=b[i]-'
longlen=()>
())?
():
intk=0;
len;
arr3[k++]=arr1[i]-arr2[i];
if(arr3[k-1]<
0){
arr3[k]='
-'
arr3[i]=abs(arr3[i]);
stringresult="
buff="
while(arr3[k]==0){
k--;
for(inti=k;
buff=arr3[i]+'
result+=buff;
returnresult;
stringaModeB(stringa,stringb)//大数取模
if()>
()){
while(b)>
a=subtraction(a,b);
elseif()==())
if(b)>
0)
stringa,b;
a;
b;
aModeB(a,b)<