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=
经典脑筋急转弯:
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 }