AlenaNuna

导航

HJ21~HJ30 华为机试题库

HJ21 简单密码

题目:https://www.nowcoder.com/practice/7960b5038a2142a18e27e4c733855dac?tpId=37&tqId=21244&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 n,D[500];
 4 char s[110];
 5 void init(){
 6     D['1']=1;
 7     D['a']=D['b']=D['c']=2;
 8     D['d']=D['e']=D['f']=3;
 9     D['g']=D['h']=D['i']=4;
10     D['j']=D['k']=D['l']=5;
11     D['m']=D['n']=D['o']=6;
12     D['p']=D['q']=D['r']=D['s']=7;
13     D['t']=D['u']=D['v']=8;
14     D['w']=D['x']=D['y']=D['z']=9;
15     D['0']=0;
16     cin.getline(s,101);
17     n=strlen(s);
18     return;
19 }
20 void Work(){
21     for(int i=0;i<n;i++){
22         if(s[i]>='a'&&s[i]<='z')
23             s[i]=D[(int)s[i]]+'0';
24         else if(s[i]>='A'&&s[i]<='Z'){
25             s[i]=s[i]-'A'+'b';
26             if(s[i]=='{')s[i]='a';
27         }
28     }
29     puts(s);
30     return;
31 }
32 int main(){
33     init();
34     Work();
35     return 0;
36 }

 HJ22 汽水瓶

题目:https://www.nowcoder.com/practice/fe298c55694f4ed39e256170ff2c205f?tpId=37&tqId=21245&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

经典脑筋急转弯:

某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
sum表示总共喝了多少瓶,sx记录本回换完饮料后还剩多少空瓶子,t是当前的空瓶子数。然后模拟就行了…
代码是之前写的,挺丑陋的=。=不过也懒得管了
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int main(){
 5     scanf("%d",&n);
 6     while(n){
 7         int t=n,sum=0,sx=0;
 8         while(t>=3){
 9             int nw=t/3;
10             sum+=nw;
11             sx=t%3;
12             t=nw+sx;
13             sx=0;
14         }
15         if(t==2)sum++;
16         printf("%d\n",sum);
17         scanf("%d",&n);
18     }
19     return 0;
20 }

 HJ23 删除字符串中出现次数最少的字符

题目:https://www.nowcoder.com/practice/05182d328eb848dda7fdd5e029a56da9?tpId=37&tqId=21246&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

n才20,乱做

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[22];
 4 int n,cnt[500],mn;
 5 int main(){
 6     cin>>s;
 7     n=strlen(s);
 8     for(int i=0;i<n;i++)
 9         cnt[(int)s[i]]++;
10     mn=n;
11     for(int i=0;i<n;i++)
12         mn=min(mn,cnt[(int)s[i]]);
13     for(int i=0;i<n;i++)
14         if(cnt[(int)s[i]]!=mn)printf("%c",s[i]);
15     return 0;
16 }

 HJ24 合唱队

题目:https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4?tpId=37&tqId=21247&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

啊,真是一个经典又简单的题目。左右各跑一遍最长上升子序列就行。

同样可以用二分和维护D数组来达到nlogn的效率,但是数据只有3000,n方就行

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,dp1[3010],dp2[3010];
 4 int a[3010],ans;
 5 void init(){
 6     cin>>n;
 7     for(int i=1;i<=n;i++)
 8         scanf("%d",&a[i]);
 9     return;
10 }
11 void Work(){
12     for(int i=1;i<=n;i++)
13         dp1[i]=dp2[i]=1;
14     for(int i=2;i<=n;i++){
15         for(int j=1;j<i;j++){
16             if(a[j]<a[i])dp1[i]=max(dp1[i],dp1[j]+1);
17         }
18     }
19     for(int i=n-1;i>=1;i--){
20         for(int j=n;j>i;j--){
21             if(a[j]<a[i])dp2[i]=max(dp2[i],dp2[j]+1);
22         }
23     }
24     return;
25 }
26 int main(){
27     init();
28     Work();
29     ans=1;
30     for(int i=1;i<=n;i++)
31         ans=max(ans,dp1[i]+dp2[i]-1);
32     ans=n-ans;
33     cout<<ans;
34     return 0;
35 }

HJ25 数据分类处理

题目:https://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd?tpId=37&tqId=21248&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 I[110],numI,R[110],numR,r[110],numr;
 4 int ans[31000],numans=0;
 5 char SI[110][11];
 6 void QuChong(){
 7     sort(R,R+numR);
 8     r[numr=0]=R[0];
 9     for(int i=1;i<numR;i++)
10         if(R[i-1]!=R[i])r[++numr]=R[i];
11     numr++;
12     return;
13 }
14 void initWork(){
15     stringstream t;
16     for(int i=0;i<numI;i++){
17         t.clear();
18         t<<I[i];
19         t>>SI[i];
20     }
21     return;
22 }
23 bool Check(int x){
24     char sx[11];
25     stringstream t;
26     t.clear();
27     t<<x;
28     t>>sx;
29     bool f=0;
30     int cnt=0;
31     for(int i=0;i<numI;i++){
32         if(strstr(SI[i],sx)!=NULL){
33             f=1;
34             cnt++;
35         }
36     }
37     if(!f)return 0;
38     ans[++numans]=cnt;
39     for(int i=0;i<numI;i++){
40         if(strstr(SI[i],sx)!=NULL){
41             ans[++numans]=i;
42             ans[++numans]=I[i];
43         }
44     }
45     return f;
46 }
47 int main(){
48     cin>>numI;
49     for(int i=0;i<numI;i++)scanf("%d",&I[i]);
50     cin>>numR;
51     for(int i=0;i<numR;i++)scanf("%d",&R[i]);
52     QuChong();
53     initWork();
54     for(int i=0;i<numr;i++){
55         ans[++numans]=r[i];
56         if(!Check(r[i])){
57             numans--;
58         }
59     }
60     ans[0]=numans;
61     for(int i=0;i<=numans;i++)
62         printf("%d ",ans[i]);
63     return 0;
64 }

 HJ26 字符串排序

题目:https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584?tpId=37&tqId=21249&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

如果非字母,就记录一下符号和该符号的位置。

如果是字母,对于条件一,就整理成都是大写或者都是小写再比较就可以;

      对于条件二,stable_sort()就可以控制相同情况下顺序不变。

然后输出注意一下就行。

喝了死咖啡烦死了……………………脑子跟浆糊一样,脑和手好像分家了,以后不想喝了。讨厌。

两点了,睡觉去了不写了,明早还要考美团第二场

——第二天后续:早上十点到十一点半考了美团笔试第二场,编程题仍然是一个小时20分钟三道题。还是只写出了前两题。第一题秒了,第二题我的锅,忘了树它可以以乱七八糟的形式给我,再由自己整理出来,结果WA了好久,浪费了快要二十分钟,最后想起来自己太久没写树了连这种细节都忘了,赶紧补个Dfs,两分钟过了。第三题大概写了四五十分钟第三题可以拿线段树维护,感觉有点写不完了,就想写个暴力先,结果判定的细节有点多,而且发现数据很强,根本拿不到部分分。感觉就算写了正解也要调很久,啊啊啊> <

由于编程部分3道题占70分,我大胆猜测分数分配应该是20 25 25或者15 25 30,那编程题部分我应该就拿了40~45分。

啊啊,好想ak啊,可是细节真的好多啊啊啊啊啊啊啊我好弱

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1010],s1[1010];
 4 int n,num_fzm=0,n1=0,cnt=0,cnt_zm,cnt_fzm;
 5 struct FZM{
 6     char c;
 7     int id;
 8 }fzm[1010];
 9 bool cmp(const char&a,const char&b){
10     int c=0,d=0;
11     if(a>='A'&&a<='Z') c=a-'A'+'a';
12     else c=(int)a;
13     if(b>='A'&&b<='Z') d=b-'A'+'a';
14     else d=(int)b;
15     return c<d;
16 }
17 void init(){
18     cin.getline(s,1001);
19     n=strlen(s);
20     for(int i=0;i<n;i++){
21         if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
22             s1[n1++]=s[i];
23         }
24         else{
25             fzm[++num_fzm].c=s[i];
26             fzm[num_fzm].id=i;
27         }
28     }
29     stable_sort(s1,s1+n1,cmp);
30     return;
31 }
32 void Output(){
33     int cnts1=0;
34     for(int i=1;i<=num_fzm;i++){
35         int t;
36         if(i==1)t=fzm[i].id;
37         else t=fzm[i].id-fzm[i-1].id-1;
38         cnt=0;
39         while(cnt<t)printf("%c",s1[cnts1++]),cnt++;
40         printf("%c",fzm[i].c);
41     }
42     while(cnts1<n1)printf("%c",s1[cnts1++]);
43     return;
44 }
45 int main(){
46     init();
47     Output();
48     return 0;
49 }

 HJ27 查找兄弟单词

题目:https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68?tpId=37&tqId=21250&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 n,l,len,ct[300],ct2[1100][300],num_ans=0,k;
 4 string str[1100],x,ans[1100],ans2[1100];
 5 bool book[1100];
 6 void init(){
 7     cin>>n;
 8     for(int i=1;i<=n;i++)
 9         cin>>str[i];
10     cin>>x;
11     l=x.size();
12     for(int i=0;i<l;i++)
13         ct[(int)x[i]]++;
14     cin>>k;
15     return;
16 }
17 void Work(){
18     for(int i=1;i<=n;i++){
19         if((int)str[i].size()!=l)continue;
20         if(x==str[i])continue;
21         for(int j=0;j<l;j++){
22             ct2[i][(int)str[i][j]]++;
23         }
24         bool f=1;
25         for(int j=0;j<l;j++)
26             if(ct[(int)x[j]]!=ct2[i][(int)x[j]])f=0;
27         if(f) ans[++num_ans]=str[i];
28     }
29     sort(ans+1,ans+num_ans+1);
30     cout<<num_ans<<endl;
31     if(num_ans>=k)cout<<ans[k]<<endl;
32     return;
33 }
34 int main(){
35     init();
36     Work();
37     return 0;
38 }

这个周末光比赛和考试就打了三场…可惜pdd的机试写得很糟糕…因为完全错误预计了pdd的机试难度,没有想到会出得这么难,心态有点爆炸了直接弃疗了……结果晚上一看所有人都在抱怨难。看来心态还是不太好啊> <而且也不够相信自己。嘤嘤嘤

然后周日打完pdd机试心态爆炸之后就好好休息了一天,毕竟之前基本每天都才睡五六个小时就起来打代码了。

HJ28 素数伴侣

题目:https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e?tpId=37&tqId=21251&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

这个是华为机试的“困难”题,也就是个线性筛和匈牙利算法,我感觉还没今天pdd的t1难=。=…

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[110],cnt[110],pd[110][110],maxa;
 4 int MinSS[60010],Prime[60010],numPrime=0,ans=0;
 5 int match[110];
 6 bool isPrime[60010],BeiXuan[110],book[110];
 7 void XianXingShai(int n){
 8     for(int i=2;i<=n;i++){
 9         if(MinSS[i]==0){
10             MinSS[i]=i;
11             isPrime[i]=1;
12             Prime[++numPrime]=i;
13         }
14         for(int j=1;j<=numPrime;j++){
15             if(Prime[j]>MinSS[i]||Prime[j]*i>n)break;
16             MinSS[Prime[j]*i]=Prime[j];
17         }
18     }
19     return;
20 }
21 void initWork(){
22     for(int i=1;i<=n;i++)
23         for(int j=1;j<=n;j++){
24             if(i!=j&&isPrime[a[i]+a[j]])pd[i][++cnt[i]]=j;
25         }
26     return;
27 }
28 bool Dfs(int u){
29     book[u]=1;
30     for(int i=1;i<=cnt[u];i++){
31         int v=pd[u][i];
32         if(match[v]==0||(book[match[v]]==0&&Dfs(match[v]))){
33             match[v]=u;
34             match[u]=v;
35             return 1;
36         }
37     }
38     return 0;
39 }
40 int main(){
41     cin>>n;
42     for(int i=1;i<=n;i++)scanf("%d",&a[i]),maxa=max(maxa,a[i]);
43     maxa*=2;
44     XianXingShai(maxa);
45     initWork();//预处理出能配对的数
46     ans=0;
47     for(int i=1;i<=n;i++){
48         memset(book,0,sizeof(book));
49         if(match[i]==0&&Dfs(i))ans++;
50     }
51     cout<<ans;
52     return 0;
53 }

 HJ29 字符串加解密

题目:https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a?tpId=37&tqId=21252&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

很简单的模拟题,判定一下边界就行。

呜呜……华为的机试题比起拼多多的真是温柔到窒息啊T_T

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1010],s2[1010];
 4 int n;
 5 void init(){
 6     scanf("%s%s",s,s2);
 7     return;
 8 }
 9 void Work(){
10     n=strlen(s);
11     for(int i=0;i<n;i++){
12         if(s[i]>='a'&&s[i]<='z'){
13             if(s[i]!='z')s[i]++;
14             else s[i]='a';
15             s[i]=s[i]-'a'+'A';
16         }
17         else if(s[i]>='A'&&s[i]<='Z'){
18             if(s[i]!='Z')s[i]++;
19             else s[i]='A';
20             s[i]=s[i]-'A'+'a';
21         }
22         else if(s[i]>='0'&&s[i]<='9'){
23             if(s[i]!='9')s[i]++;
24             else s[i]='0';
25         }
26     }
27     puts(s);
28     n=strlen(s2);
29     for(int i=0;i<n;i++){
30         if(s2[i]>='a'&&s2[i]<='z'){
31             if(s2[i]!='a')s2[i]--;
32             else s2[i]='z';
33             s2[i]=s2[i]-'a'+'A';
34         }
35         else if(s2[i]>='A'&&s2[i]<='Z'){
36             if(s2[i]!='A')s2[i]--;
37             else s2[i]='Z';
38             s2[i]=s2[i]-'A'+'a';
39         }
40         else if(s2[i]>='0'&&s2[i]<='9'){
41             if(s2[i]!='0')s2[i]--;
42             else s2[i]='9';
43         }
44     }
45     puts(s2);
46     return;
47 }
48 int main(){
49     init();
50     Work();
51     return 0;
52 }

 HJ30 字符串合并处理

题目:https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f?tpId=37&tqId=21253&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 str2[110];
 4 char s[220],s1[110],s2[110];
 5 int len,l1,l2,ShiLiu[220],FZ2[220][5];
 6 char Ans[220];
 7 void Into16(int u){
 8     char c=s[u];
 9     if(c>='0'&&c<='9'){
10         ShiLiu[u]=c-'0';
11         return;
12     }
13     if(c>='A'&&c<='F'){
14         ShiLiu[u]=c-'A'+10;
15         return;
16     }
17     if(c>='a'&&c<='f'){
18         ShiLiu[u]=c-'a'+10;
19         return;
20     }
21     return;
22 }
23 void Work2(int u){
24     int x=ShiLiu[u],t,cnt=0;
25     for(int i=0;i<=3;i++){
26         t=1<<i;
27         ++cnt;
28         if(t&x)FZ2[u][cnt]=1;else FZ2[u][cnt]=0;
29     }
30     FZ2[u][0]=cnt;
31     return;
32 }
33 void Into16_2(int u){
34     int cnt=FZ2[u][0];
35     int x=0,t=1;
36     for(int i=cnt;i>=1;i--){
37         x=x+FZ2[u][i]*t;
38         t*=2;
39     }
40     if(x>=0&&x<=9)Ans[u]=x+'0';
41     if(x>=10)Ans[u]=x-10+'A';
42     return;
43 }
44 bool Check(int u){
45     char c=s[u];
46     if(c>='0'&&c<='9')return 1;
47     if(c>='A'&&c<='F')return 1;
48     if(c>='a'&&c<='f')return 1;
49     return 0;
50 }
51 int main(){
52     scanf("%s%s",s,str2);
53     strcat(s,str2);
54     len=strlen(s);
55     l1=0;l2=0;
56     for(int i=0;i<len;i+=2){
57         s1[l1++]=s[i];
58     }
59     for(int i=1;i<len;i+=2)
60         s2[l2++]=s[i];
61     sort(s1,s1+l1);
62     sort(s2,s2+l2);
63     l1=0;l2=0;
64     for(int i=0;i<len;i+=2)
65         s[i]=s1[l1++];
66     for(int i=1;i<len;i+=2)
67         s[i]=s2[l2++];
68     for(int i=0;i<len;i++){
69         if(Check(i)){
70             Into16(i);
71             Work2(i);
72             Into16_2(i);
73         }
74         else Ans[i]=s[i];
75     }
76     puts(Ans);
77     return 0;
78 }

 

posted on 2024-09-07 00:47  AlenaNuna  阅读(18)  评论(0编辑  收藏  举报