华为OD机试真题 新系统-字符串格式调整(C/C++/Py/Java/Js/Go)
字符串格式调整
华为OD机试新系统真题 华为OD上机考试新系统真题 6月14号 100分题型
华为OD机试新系统真题目录点击查看: 华为OD机试新系统真题题库目录|机考题库 + 算法考点详解
题目内容
输入一个字符串,字符串中只包含大写字母和数字。要求将字符串中的所有数字提取出来,按出现的顺序组成一个新的数字字符串;将所有字母提取出来,按出现的顺序组成一个新的字母字符串。最后将数字和字母按输入顺序交替输出,每个字母需要按其对应位置的数字n nn重复输出n nn次。如果两者长度不等,则将长出的部分直接拼接到末尾。
输入描述
输入只有一行,只包含大写字母和数字的字符串S ( 1 < = S(1<=S(1<=长度< = 100 <=100<=100)。
输出描述
输出只有一行,即按要求处理后的字符串。
补充说明
- 每个字母按其对应位置的数字n nn重复输出n nn次,如果数字为0 00则该字母不输出
- 如果只包含字母或只包含数字,直接输出原字符串
样例1
输入
A1B2C3输出
1A2BB3CCC说明
- 数字:1 11,2 22,3 33
- 字母:A , B , C A,B,CA,B,C
- 交替输出:1 11(A AA重复1 11次)+ ++2 22(B BB重复2 22次)+ ++3 33(C CC重复3 33次)= ==1 A 2 B B 3 C C C 1A2BB3CCC1A2BB3CCC
样例2
输入
ABC0123输出
01B2CC3说明
- 数字:0 00,1 11,2 22,3 33
- 字母:A , B , C A,B,CA,B,C
- 交替输出:0 00(A AA重复0 00次不输出)+ ++1 11(B BB重复1 11次)+ ++2 22(C CC重复2 22次)+ ++3 33(多余)= ==01 B 2 C C 3 01B2CC301B2CC3
样例3
输入
B输出
B说明
如果只包含字母或只包含数字,直接输出原字符串
题解
思路:模拟
- 按顺序遍历
s提取数字字符和字母字符分别存储至alphaStr和digitStr中。 - 判断
alphaStr或digitStr是否为空,如果存在一方为空情况直接输出另一方即可。 - 获取
aLen = alphaStr.size(), dLen = digitStr.size(),对于len = min(aLen, dLen)部分按照题目意思进行模拟构造即可。 - 如果
aLen != dLen的情况,将对应超过len = min(aLen, dLen)的子串拼接到结果中即可。
C++
#include<bits/stdc++.h> #include <cctype> using namespace std; string formatStr(string& s) { string alphaStr, digitStr; int n = s.size(); for (int i = 0; i < n; i++) { char c = s[i]; if (isdigit(c)) { digitStr.push_back(c); } else { alphaStr.push_back(c); } } // 有一方为空,直接返回另一部分即可 if (alphaStr.empty()) { return digitStr; } if (digitStr.empty()) { return alphaStr; } string ans; int dLen = digitStr.size(); int aLen = alphaStr.size(); // 处理相同长度部分交替输出 for (int i = 0; i < dLen && i < aLen; i++) { char digitChar = digitStr[i]; char alphaChar = alphaStr[i]; ans.push_back(digitChar); int repeate = digitChar - '0'; for (int j = 0; j < repeate; j++) { ans.push_back(alphaChar); } } // 考虑超过部分 if (dLen < aLen) { ans += alphaStr.substr(dLen); } if (aLen < dLen) { ans += digitStr.substr(aLen); } return ans; } int main() { string s; getline(cin, s); cout << formatStr(s); return 0; }Java
import java.util.Scanner; public class Main { public static String formatStr(String s) { StringBuilder alphaStr = new StringBuilder(); StringBuilder digitStr = new StringBuilder(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); if (Character.isDigit(c)) { digitStr.append(c); } else { alphaStr.append(c); } } // 有一方为空,直接返回另一部分即可 if (alphaStr.length() == 0) { return digitStr.toString(); } if (digitStr.length() == 0) { return alphaStr.toString(); } StringBuilder ans = new StringBuilder(); int dLen = digitStr.length(); int aLen = alphaStr.length(); // 处理相同长度部分交替输出 for (int i = 0; i < dLen && i < aLen; i++) { char digitChar = digitStr.charAt(i); char alphaChar = alphaStr.charAt(i); ans.append(digitChar); int repeat = digitChar - '0'; for (int j = 0; j < repeat; j++) { ans.append(alphaChar); } } // 考虑超过部分 if (dLen < aLen) { ans.append(alphaStr.substring(dLen)); } if (aLen < dLen) { ans.append(digitStr.substring(aLen)); } return ans.toString(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.print(formatStr(s)); } }Python
defformat_str(s):alpha_str=[]digit_str=[]n=len(s)foriinrange(n):c=s[i]ifc.isdigit():digit_str.append(c)else:alpha_str.append(c)alpha_str=''.join(alpha_str)digit_str=''.join(digit_str)# 有一方为空,直接返回另一部分即可ifnotalpha_str:returndigit_strifnotdigit_str:returnalpha_str ans=[]d_len=len(digit_str)a_len=len(alpha_str)# 处理相同长度部分交替输出foriinrange(min(d_len,a_len)):digit_char=digit_str[i]alpha_char=alpha_str[i]ans.append(digit_char)repeat=int(digit_char)for_inrange(repeat):ans.append(alpha_char)# 考虑超过部分ifd_len<a_len:ans.append(alpha_str[d_len:])ifa_len<d_len:ans.append(digit_str[a_len:])return''.join(ans)s=input()print(format_str(s),end="")JavaScript
constreadline=require('readline');functionformatStr(s){letalphaStr=[];letdigitStr=[];letn=s.length;for(leti=0;i<n;i++){letc=s[i];if(/\d/.test(c)){digitStr.push(c);}else{alphaStr.push(c);}}alphaStr=alphaStr.join('');digitStr=digitStr.join('');// 有一方为空,直接返回另一部分即可if(alphaStr.length===0){returndigitStr;}if(digitStr.length===0){returnalphaStr;}letans=[];constdLen=digitStr.length;constaLen=alphaStr.length;// 处理相同长度部分交替输出for(leti=0;i<dLen&&i<aLen;i++){constdigitChar=digitStr[i];constalphaChar=alphaStr[i];ans.push(digitChar);constrepeat=Number(digitChar);for(letj=0;j<repeat;j++){ans.push(alphaChar);}}// 考虑超过部分if(dLen<aLen){ans.push(alphaStr.slice(dLen));}if(aLen<dLen){ans.push(digitStr.slice(aLen));}returnans.join('');}constrl=readline.createInterface({input:process.stdin,output:process.stdout});constlines=[];rl.on('line',line=>{lines.push(line);});rl.on('close',()=>{consts=lines[0];console.log(formatStr(s));});Go
packagemainimport("bufio""fmt""os""unicode")funcformatStr(sstring)string{varalphaStr[]runevardigitStr[]runefor_,c:=ranges{ifunicode.IsDigit(c){digitStr=append(digitStr,c)}else{alphaStr=append(alphaStr,c)}}// 有一方为空,直接返回另一部分即可iflen(alphaStr)==0{returnstring(digitStr)}iflen(digitStr)==0{returnstring(alphaStr)}varans[]runedLen:=len(digitStr)aLen:=len(alphaStr)// 处理相同长度部分交替输出fori:=0;i<dLen&&i<aLen;i++{digitChar:=digitStr[i]alphaChar:=alphaStr[i]ans=append(ans,digitChar)repeat:=int(digitChar-'0')forj:=0;j<repeat;j++{ans=append(ans,alphaChar)}}// 考虑超过部分ifdLen<aLen{ans=append(ans,alphaStr[dLen:]...)}ifaLen<dLen{ans=append(ans,digitStr[aLen:]...)}returnstring(ans)}funcmain(){reader:=bufio.NewReader(os.Stdin)varsstrings,_=reader.ReadString('\n')iflen(s)>0&&s[len(s)-1]=='\n'{s=s[:len(s)-1]}fmt.Print(formatStr(s))}C语言
#include<stdio.h>#include<string.h>#include<ctype.h>char*formatStr(char*s){staticcharans[1000];charalphaStr[500];chardigitStr[500];intaLen=0;intdLen=0;intn=strlen(s);for(inti=0;i<n;i++){charc=s[i];if(isdigit(c)){digitStr[dLen++]=c;}else{alphaStr[aLen++]=c;}}alphaStr[aLen]='\0';digitStr[dLen]='\0';// 有一方为空,直接返回另一部分即可if(aLen==0){strcpy(ans,digitStr);returnans;}if(dLen==0){strcpy(ans,alphaStr);returnans;}intpos=0;// 处理相同长度部分交替输出intlimit=dLen<aLen?dLen:aLen;for(inti=0;i<limit;i++){chardigitChar=digitStr[i];charalphaChar=alphaStr[i];ans[pos++]=digitChar;intrepeat=digitChar-'0';for(intj=0;j<repeat;j++){ans[pos++]=alphaChar;}}// 考虑超过部分if(dLen<aLen){strcpy(ans+pos,alphaStr+dLen);pos+=strlen(alphaStr+dLen);}if(aLen<dLen){strcpy(ans+pos,digitStr+aLen);pos+=strlen(digitStr+aLen);}ans[pos]='\0';returnans;}intmain(){chars[500];fgets(s,sizeof(s),stdin);intlen=strlen(s);if(len>0&&s[len-1]=='\n'){s[len-1]='\0';}printf("%s",formatStr(s));return0;}