HJ11~HJ20 华为机试题库
HJ11 数字颠倒
题目:https://www.nowcoder.com/practice/ae809795fca34687a48b172186e3dafe?tpId=37&tqId=21234&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
过于简单了= =
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[200]; 4 int l; 5 int main(){ 6 cin>>s; 7 l=strlen(s); 8 for(int i=l-1;i>=0;i--)printf("%c",s[i]); 9 return 0; 10 }
HJ12 字符串反转
题目:https://www.nowcoder.com/practice/e45e078701ab4e4cb49393ae30f1bb04?tpId=37&tqId=21235&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
就上面这个题把范围改大一点就能交了= =
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[1100]; 4 int l; 5 int main(){ 6 cin>>s; 7 l=strlen(s); 8 for(int i=l-1;i>=0;i--)printf("%c",s[i]); 9 return 0; 10 }
HJ13 句子逆序
题目:https://www.nowcoder.com/practice/48b3cb4e3c694d9da5526e6255bb73c3?tpId=37&tqId=21236&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
每次读完字符串之后多getchar一次判断一下该行结束没(因为有多组数据),如果改行结束了,就把这行的字符串数组倒序输出。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[1010][1010],c; 4 int cnt=0; 5 int main(){ 6 while(~scanf("%s",s[++cnt])){ 7 c=getchar(); 8 if(c=='\n'){ 9 for(int i=cnt;i>=1;i--)printf("%s ",s[i]); 10 puts(""); 11 cnt=0; 12 } 13 } 14 return 0; 15 }
HJ14 字符串排序
题目:https://www.nowcoder.com/practice/5af18ba2eb45443aa91a11e848aa6723?tpId=37&tqId=21237&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
string是尊嘟爽啊,默认比较就是字典序的。如果用字符数组的话可以用strcmp
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 string s[1010]; 5 int main(){ 6 cin>>n; 7 for(int i=1;i<=n;i++) 8 cin>>s[i]; 9 sort(s+1,s+n+1); 10 for(int i=1;i<=n;i++) 11 cout<<s[i]<<endl; 12 return 0; 13 }
HJ15 求int型正整数在内存中存储时1的个数
题目:https://www.nowcoder.com/practice/440f16e490a0404786865e99c6ad91c9?tpId=37&tqId=21238&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 int n,cnt=0; 5 cin>>n; 6 for(int i=0;i<=31;i++){ 7 if(n&(1<<i))cnt++; 8 } 9 cout<<cnt; 10 return 0; 11 }
HJ16 购物单
题目:https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4?tpId=37&tqId=21239&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
是个加了限制条件的背包问题。如果q[i]不等于0,那么你就必须买了编号为q[i]的商品才能购买编号为i的商品
注意到一个主件最多只会有两个附件,那就把每个主件带着它的附件合并成一个整体,num_fa是主件数。
对每个整体进行dp,dp[i][j]表示对于前i个整体花费了j元能得到的最大满意度。然后对于每个整体,dp的过程中拆开来维护一下里面的两个附件是否要购买就可以了。
注意到价格只会是10的整数,所以对于价格整体除以10,这样循环的层数可以少10倍,会快一些。输出结果时再把10乘回去就行。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,dp[65][3202],duiying[65],num_fa=0; 4 struct SP{ 5 int v,p,q,id; 6 }a[65]; 7 struct Bag{ 8 int v,p,id,num_son; 9 int sv[3],sp[3],sid[3]; 10 }b[65]; 11 void init(){ 12 cin>>n>>m; 13 n/=10; 14 for(int i=1;i<=m;i++){ 15 scanf("%d%d%d",&a[i].v,&a[i].p,&a[i].q); 16 a[i].v/=10; 17 a[i].id=i; 18 } 19 for(int i=1;i<=m;i++){ 20 if(a[i].q==0){ 21 b[++num_fa].id=a[i].id; 22 b[num_fa].p=a[i].p; 23 b[num_fa].v=a[i].v; 24 for(int j=1;j<=m;j++){ 25 if(a[j].q==b[num_fa].id){ 26 b[num_fa].num_son++; 27 b[num_fa].sv[b[num_fa].num_son]=a[j].v; 28 b[num_fa].sp[b[num_fa].num_son]=a[j].p; 29 b[num_fa].sid[b[num_fa].num_son]=a[j].id; 30 } 31 } 32 } 33 } 34 return; 35 } 36 void Work(){ 37 for(int i=1;i<=num_fa;i++){ 38 for(int j=0;j<=n;j++){ 39 if(j>=b[i].v){ 40 dp[i][j]=max(dp[i][j],dp[i-1][j-b[i].v]+b[i].v*b[i].p); 41 for(int k=1;k<=b[i].num_son;k++){ 42 if(j>=b[i].v+b[i].sv[k]) 43 dp[i][j]=max(dp[i][j],dp[i-1][j-b[i].v-b[i].sv[k]] 44 +b[i].v*b[i].p+b[i].sv[k]*b[i].sp[k]); 45 } 46 if(b[i].num_son==2&&j>=b[i].v+b[i].sv[1]+b[i].sv[2]) 47 dp[i][j]=max(dp[i][j],dp[i-1][j-b[i].v-b[i].sv[1]-b[i].sv[2]] 48 +b[i].v*b[i].p+b[i].sv[1]*b[i].sp[1]+b[i].sv[2]*b[i].sp[2]); 49 } 50 dp[i][j]=max(dp[i][j],dp[i-1][j]); 51 } 52 } 53 return; 54 } 55 void Output(){ 56 printf("%d\n",dp[num_fa][n]*10); 57 return; 58 } 59 int main(){ 60 init(); 61 Work(); 62 Output(); 63 return 0; 64 }
HJ17 坐标移动
题目:https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29?tpId=37&tqId=21240&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
挺简单的,就是判断命令合法性那里细节有点多。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char c,FX[10010]; 4 int num_FX=0,SZ[10010],x,dx=0,dy=0,cnt; 5 char s[10010]; 6 bool CheckFX(char c){ 7 if(c=='A'||c=='D'||c=='W'||c=='S')return 1; 8 return 0; 9 } 10 bool CheckSZ(char c){ 11 if(c>='0'&&c<='9')return 1; 12 return 0; 13 } 14 void init(){ 15 c=getchar(); 16 while(c!='\n'){ 17 if(CheckFX(c)){ 18 FX[++num_FX]=c; 19 cnt=0; 20 c=getchar(); 21 while(c!=';'){ 22 s[cnt++]=c; 23 c=getchar(); 24 } 25 bool f=1;x=0; 26 if(cnt==0||cnt>2)f=0; 27 for(int i=0;i<cnt;i++){ 28 x=x*10+s[i]-'0'; 29 if(CheckSZ(s[i])==0)f=0; 30 } 31 if (!f) num_FX--; 32 else SZ[num_FX]=x; 33 } 34 else{ 35 while(c!=';')c=getchar(); 36 } 37 c=getchar(); 38 } 39 return; 40 } 41 void Work(){ 42 for(int i=1;i<=num_FX;i++){ 43 if(FX[i]=='A'){ 44 dx-=SZ[i]; 45 } 46 else if(FX[i]=='D'){ 47 dx+=SZ[i]; 48 } 49 else if(FX[i]=='W'){ 50 dy+=SZ[i]; 51 } 52 else{ 53 dy-=SZ[i]; 54 } 55 } 56 return; 57 } 58 int main(){ 59 init(); 60 Work(); 61 printf("%d,%d",dx,dy); 62 return 0; 63 }
HJ18 识别有效的IP地址和掩码并进行分类统计
题目:https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682?tpId=37&tqId=21241&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[500]; 4 int l,cnt_num=0,sz[10],CW=0,A=0,B=0,C=0,D=0,E=0,syIP=0; 5 int st; 6 int IntoNum(int i){ 7 int x=0,f=1; 8 while(s[i]<'0'||s[i]>'9'){ 9 if(s[i]=='-') f=-1; 10 i++; 11 } 12 while(s[i]>='0'&&s[i]<='9'){ 13 x=x*10+s[i]-'0'; 14 i++; 15 } 16 return f*x; 17 } 18 void CheckIPtype(){ 19 if(sz[1]>=1&&sz[1]<=126)A++; 20 if(sz[1]>=128&&sz[1]<=191)B++; 21 if(sz[1]>=192&&sz[1]<=223)C++; 22 if(sz[1]>=224&&sz[1]<=239)D++; 23 if(sz[1]>=240&&sz[1]<=255)E++; 24 if(sz[1]==10)syIP++; 25 if(sz[1]==172&&(sz[2]>=16&&sz[2]<=31))syIP++; 26 if(sz[1]==192&&sz[2]==168)syIP++; 27 return; 28 } 29 bool CheckYM(){ 30 int a[33],cnt=0,x; 31 for(int i=5;i<=8;i++){ 32 x=1<<7; 33 for(int j=1;j<=8;j++){ 34 cnt++; 35 if(sz[i]&x) a[cnt]=1; else a[cnt]=0; 36 x>>=1; 37 } 38 } 39 if(a[1]==0)return 0; 40 for(int i=2;i<=32;i++) 41 if(a[i]==1&&a[i-1]==0) return 0; 42 if(a[32]==1)return 0; 43 return 1; 44 } 45 bool CheckIP(){ 46 for(int i=1;i<=8;i++) 47 if(sz[i]<0||sz[i]>255) return 0; 48 return 1; 49 } 50 int main(){ 51 while(~scanf("%s",s)){ 52 cnt_num=0; 53 l=strlen(s); 54 for(int i=0;i<l;i++){ 55 if(s[i]>='0'&&s[i]<='9'){ 56 if(i==0||(s[i-1]<'0'||s[i-1]>'9')) 57 sz[++cnt_num]=IntoNum(i); 58 } 59 } 60 if(sz[1]==0||sz[1]==127)continue; 61 if(cnt_num!=8 || !CheckIP() || !CheckYM()){ 62 CW++; 63 continue; 64 } 65 CheckIPtype(); 66 } 67 printf("%d %d %d %d %d %d %d",A,B,C,D,E,CW,syIP); 68 return 0; 69 }
HJ19 简单错误记录
题目:https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb?tpId=37&tqId=21242&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=110; 4 char a[maxn][maxn]; 5 int b[maxn],num_qc=0,cnt[maxn],ans[maxn],num_ans=0; 6 bool fg[maxn],f[maxn]; 7 struct JL{ 8 char s[maxn],zm[maxn]; 9 int num,cnt; 10 }jl[maxn],qc[maxn]; 11 void wk(char ans[],char zm[],char a[]){ 12 int la=strlen(a); 13 int lst=0; 14 for(int i=0;i<la;i++){ 15 if(a[i]=='\\')lst=i; 16 } 17 if(lst) lst++; 18 char c[maxn]={}; 19 int lc=0; 20 for(int i=lst;i<la;i++) c[lc++]=a[i]; 21 if(lc<=16) { 22 strcpy(ans,c); 23 strcpy(zm,c); 24 return; 25 } 26 lc=strlen(c); 27 for(int i=0;i<16;i++) 28 ans[i]=c[lc-16+i]; 29 strcpy(zm,c); 30 return; 31 } 32 int main(){ 33 int n=0; 34 while(~scanf("%s",a[n])){ 35 scanf("%d",&b[n]); 36 n++; 37 } 38 for(int i=0;i<n;i++)fg[i]=1; 39 for(int i=0;i<n;i++){ 40 if(fg[i]==0)continue; 41 for(int j=i+1;j<n;j++){ 42 if(fg[j]==0)continue; 43 if(b[i]!=b[j])continue; 44 if(strcmp(a[i],a[j])==0)fg[j]=0; 45 } 46 }//quchong 47 num_qc=0; 48 for(int i=0;i<n;i++){ 49 if(fg[i]==0)continue; 50 num_qc++; 51 qc[num_qc].num=b[i]; 52 wk(qc[num_qc].s,qc[num_qc].zm,a[i]); 53 } 54 for(int i=1;i<=num_qc;i++)f[i]=1; 55 for(int i=1;i<=num_qc;i++){ 56 if(f[i]==0) continue; 57 for(int j=i+1;j<=num_qc;j++){ 58 if(f[j]==0)continue; 59 if(strcmp(qc[i].s,qc[j].s)==0&&qc[i].num==qc[j].num){ 60 qc[i].cnt++; 61 f[j]=0; 62 } 63 } 64 qc[i].cnt++; 65 ans[++num_ans]=i; 66 } 67 if(num_ans>8){ 68 for(int i=num_ans-8+1;i<=num_ans;i++){ 69 printf("%s %d %d\n",qc[ans[i]].s,qc[ans[i]].num,qc[ans[i]].cnt); 70 } 71 } 72 else { 73 for(int i=1;i<=num_ans;i++) 74 printf("%s %d %d\n",qc[ans[i]].s,qc[ans[i]].num,qc[ans[i]].cnt); 75 } 76 return 0; 77 }
HJ20 密码验证合格程序
题目:https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841?tpId=37&tqId=21243&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
前两个判断很简单,就不多说了
第三个的判断可以用strstr。strstr(s1,s2)返回的是s2第一次在s1中出现的地址,如果不存在则返回NULL。
strstr(s1+from+1,s2)则是不包括当前起始位置。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[110],s1[110]; 4 int l,cnt; 5 bool f[5]; 6 bool Work(){ 7 for(int from=0;from+2<l;from++) 8 for(int to=from+2;to<l;to++){ 9 int len=0; 10 for(int k=from;k<=to;k++) 11 s1[len++]=s[k]; 12 s1[len]='\0'; 13 if(strstr(s+from+1,s1)!=NULL)return 0; 14 } 15 return 1; 16 } 17 bool Check(){ 18 l=strlen(s); 19 if(l<=8)return 0; 20 cnt=0; 21 memset(f,0,sizeof(f)); 22 for(int i=0;i<l;i++){ 23 if(s[i]>='A'&&s[i]<='Z'){ 24 if(!f[0]){ 25 f[0]=1; 26 cnt++; 27 } 28 } 29 else if(s[i]>='a'&&s[i]<='z'){ 30 if(!f[1]){ 31 f[1]=1; 32 cnt++; 33 } 34 } 35 else if(s[i]>='0'&&s[i]<='9'){ 36 if(!f[2]){ 37 f[2]=1; 38 cnt++; 39 } 40 } 41 else { 42 if(!f[3]){ 43 f[3]=1; 44 cnt++; 45 } 46 } 47 } 48 if(cnt<3)return 0; 49 if(Work()) return 1; 50 else return 0; 51 } 52 int main(){ 53 while(~scanf("%s",s)){ 54 if (Check()) puts("OK"); 55 else puts("NG"); 56 } 57 return 0; 58 }
话说,打了三把王者再来写题就有点晚了。然后本来在喝咖啡饮料,发现十二点还不困还挺意外的,以为提神作用挺好的。然后写代码写着写着就发现虽然精神上来了,但是思维很紊乱,出好多莫名其妙神志不清的bug,甚至现在连打字都总是打错别字。。。。。
看来所谓兴奋剂提神并没有什么作用= = 人清醒了,脑子紊乱了。
总之前二十题就是搞定了=v=虽然题库里的较难和难题早就被我写完了,但是发现很多中等题和一些简单题也挺有写的意义的,华为题出的很好(虽然题意经常模糊不清很烦)但是对于巩固基础很有帮助。(谢谢华为,让我觉得我基础原来挺不咋地的= =很多题目一眼easy然后就出一些莫名其妙的错误,发现自己基础不太行,有的细节还不是那么清楚。倒是挺有用的。)
呜呜我好想快点把这个搞完,我还想写hot100,我还想去GitHub搞项目呜呜呜
妈呀,喝了咖啡感觉脑子真的好不清醒,老是打错别字好烦好烦。真是搞心态。明天早上还要考美团第二场笔试,明天晚上考AtCoder,后天下午pdd笔试> <