AlenaNuna

导航

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笔试> <

posted on 2024-09-06 15:28  AlenaNuna  阅读(5)  评论(0编辑  收藏  举报