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 }