从网上整理的华为机试题目.docx
《从网上整理的华为机试题目.docx》由会员分享,可在线阅读,更多相关《从网上整理的华为机试题目.docx(16页珍藏版)》请在冰豆网上搜索。
从网上整理的华为机试题目
一、华为机试——2018年校招
10号参加的华为的机试,这次的3道题难度适中。
第一题字符串,第二题贪心算法(会不会?
),dp可以解,第三题长整数相乘。
因为题主做过第三题原题,刚开始就把第三题秒了~~
然后开始做第一题,一般10分钟就可以搞定。
第二题要想一下,不过也差不多是原题,Leetcode上第55题jumpgame应该是此题原型。
因为都刷过几乎是原题的原故,一个小时不到3题就AC完了
下面是完整题目和代码
题目一、给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
举例!
假设原始字符串为
eeefgghhh
则每种字符出现的次数分别是
3次 1次 1次3次
重新排序后输出的字符串如下:
efghegheh
编写程序,实现上述功能。
【温馨提示】
1.原始字符串中仅可能出现“数字”和“字母”;
2.请注意区分字母大小写。
1.#include
2.#include
3.#include
4.#include
5.using namespace std;
6.int main(){
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
#include
#include
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;i<=m;i++)
{
len[i][0]=0;
for(intj=1;j<=n;j++)
{
len[0][j]=-1;
scanf("%d",&num[i][j]);
if(num[i][j])len[i][j]=len[i][j-1]+num[i][j];
elselen[i][j]=0;
}
}
stackS;
intans=0,tmp;
for(intj=n;j>0;j--)
{
intW,L;
tmp=0;
if(ans>=j*m)
break;
(0);
for(inti=1;i<=m;i++)
{
if(len[i][j]>len[()][j]){(i);}
else
{
while(!
()&&len[i][j]<=len[()][j])
{
L=();
();
intp=();
W=(i-p-1);
tmp=max(tmp,W*len[L][j]);
}
(i);
}
}
intLL;
if(!
())LL=();
while(!
())
{
L=();
();
intp=();
if(p)W=(LL-p);
else{W=LL;();}
tmp=max(tmp,W*len[L][j]);
}
ans=max(tmp,ans);
}
printf("%d\n",ans);
return0;
}
三.华为挑战赛(也是模拟机试)
题目一、
这种第一题摆明了是送分题,不好说什么,有一点编程底子的10分钟内都能做出来
#include
#include<>
usingnamespacestd;
intmain()
{
intm,n;
inti,j;
inttemp;
boolflag;
cin>>m>>n;
for(i=m;i<=n;i++)
{
flag=true;;
temp=(int)sqrt(i);
for(j=2;j<=temp;j++)
{
if(i%j==0)
flag=false;
}
if(flag==true)
cout<
}
return0;
}
题目二、
卧槽,这道题我要吐槽。
因为一些原因和问题,导致这道题占用了我整个考试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
pre">cin>>str;
for(i=0;i<();++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
字符串为:
AAA?
BBB?
CCC?
分隔符为:
?
指定的段为:
2
字符串分割为:
AAABBBCCC共三段,第2段字符串为:
BBB
输入输出格式要求
输入分隔字符串长度小于128个字符,指定的段是一个正整数。
样例
输入:
AAA?
BBB?
CCC?
?
2
输出:
BBB
实现代码如下:
#include
#include<>
#include
#include
#include
usingnamespacestd;
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{
break;
}
}
returnobjNum;
}
intmain(intargc,constchar*argv[]){
stringinpus;
cin>>inpus;
vectorobjStringInfo;
stringa="";
for(inti=0;i<();++i){
if(inpus[i]=='?
'||i==()){
(a);
a="";
}
else{
a+=inpus[i];
}
}
cout<return0;
}
运行结果:
题目一.png
题目二
输入一组大于0小于1000的整数,且均不相同,逗号隔开,输出其中能被这些整数中其他元素整除的那些元素。
输入输出格式要求
输入要求同上述描述,输出要求整数顺序按照输入时的顺序输出。
样例
输入:
2,4,6,8,10,12,3,9
输出:
4,6,8,10,12,9
代码如下:
#include
#include
#include
usingnamespacestd;
intgetStringNum(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{
break;
}
}
returnobjNum;
}
vectorgetNum(stringinputs)
{
vectorv;
vectornum;
stringbuff="";
for(inti=0;i<=();++i){
if(i==()-1){
buff=inputs[()-1];
(buff);
buff="";
}
if(inputs[i]==','){
(buff);
buff="";
}else{
buff+=inputs[i];
}
}
for(inti=0;i<();++i){
(getStringNum(v[i]));
}
returnnum;
}
intmain(intargc,constchar*argv[]){
strings;
cin>>s;
vectorarray=getNum(s);
intk=0,result[100]={0};
for(inti=0;i<();++i){
for(intj=0;j<();++j){
if(array[i]%array[j]==0&&array[i]!
=array[j])
{
result[k]=array[i];
k++;
break;
}
}
}
for(inti=0;i{
if(i!
=k-1)
cout<else
cout<}
return0;
}
题目三
描述:
大数求余
输入两个超长整型构成的字符串,使用空格隔开,求前者除以后者的余数。
输入输出格式要求
输入的每个字符串最大长度为100个字符,输出为余数值,如果结果异常输出NULL
样例
输入:
9
输出:
6172844
主要涉及大数问题,A对B取模,即除法运算,可以利用高精度减法解决,前期想的时候细节上可能会有问题,需要注意减法过程中对符号的处理
代码如下:
#include
#include
#include
usingnamespacestd;
stringsubtraction(stringa,stringb)//大数减法
{
intarr1[100]={0},arr2[100]={0},arr3[100]={0};
for(longi=()-1,k=0;i>=0;--i){
arr1[k++]=a[i]-'0';
}
for(longi=()-1,k=0;i>=0;--i){
arr2[k++]=b[i]-'0';
}
longlen=()>())?
():
();
intk=0;
for(inti=0;iarr3[k++]=arr1[i]-arr2[i];
}
for(inti=0;iif(arr3[k-1]<0){
arr3[k]='-';
arr3[i]=abs(arr3[i]);
}else{
arr3[i]=abs(arr3[i]);
}
}
stringresult="",buff="";
while(arr3[k]==0){
k--;
}
for(inti=k;i>=0;--i){
buff=arr3[i]+'0';
result+=buff;
}
returnresult;
}
stringaModeB(stringa,stringb)//大数取模
{
if()>()){
while(b)>0){
a=subtraction(a,b);
}
returna;
}
elseif()==())
{
if(b)>0)
{
while(b)>0){
a=subtraction(a,b);
}
returna;
}
else
returna;
}
else
returna;
}
intmain(intargc,constchar*argv[]){
stringa,b;
cin>>a;
cin>>b;
cout<return0;