失灵的键盘华为OD机试真题 华为OD上机考试真题 4月15号 100分题型华为OD机试真题目录点击查看: 华为OD机试真题题库目录机考题库 算法考点详解题目描述有一个键盘有 2个按键失灵了按下这些键时会连续输出其他键对应的字符两次。具体如下按下 j 键一次屏幕上显示 u(两个连续的 u )按下 b键一次屏幕上显示 t(两个连续的 tu键和 t键是好的按下 u键一次时屏幕只会显示一次 u(正常按键)按下 t键一次时屏幕只会显示一次 t (正常按键)假定屏幕上连续显示两个 t 一定是按了一次 b 键而不是两次 t键假定按键 t之后不会紧接着按键 b即 tttt转义为两个 b而不可能是 tbtu和 j同样适用该规则其它按键也都正常工作为了方便维修给定一串屏幕上输出的字符串维修师傅要求按照按键次数降序输出次数相同的按键按照对应字符的升序排序(失灵按键以原对应字符来排序)只统计按键次数大于 0的按键。同时维修师傅要求输出时需要进行一次转义(字符映射)规则如下按键 0 ~ 9直接以数字 0 ~ 9 进行输出按键 a~ z以 10~ 35 进行输出输入描述一个字符串 s 只包含小写字母和数字ss的长度不超过 500(s 中不包含 b和 j字母)补充按键范围只包括:数字 0 ~ 9和小写字母 a ~ z 且不包含b和j。输出描述按键转义后的值按键次数构成结果对所有按键的结果对按照按键次数降序排列。用例1输入t输出29:1说明单个字符→按了 t 键t键转义为 29用例2输入uuuua输出19:2 10:1说明uuuu匹配为两个jja一个题解思路:模拟 自定义排序按照题目意思就是将连续出现的uu和tt分别看作j和b处理即可。明白1之后接下来使用哈希表或者类似结构循环遍历输入字符串统计各个字符出现的数量将统计之后的数据转换为数组进行自定义排序排序规则为按照按键次数降序输出次数相同的按键按照对应字符的升序排序.然后返回结果即可。c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; int getKeyNum(char c) { if (0 c c 9) { return c - 0; } return c - a 10; } vectorvectorint count(string s) { mapchar, int charCount; int index 0, n s.size(); while (index n) { // u匹配规则 if (s[index] u index 1 n s[index 1] u) { charCount[j]; index 2; } else if (s[index] t index 1 n s[index 1] t) { charCount[b]; index 2; } else { charCount[s[index]]; index; } } vectorvectorint res; for(auto p : charCount) { res.push_back({getKeyNum(p.first), p.second}); } // 自定义排序 sort(res.begin(), res.end(), [](vectorint a, vectorint b) { return a[1] b[1]; }); return res; } int main() { string s; cin s; vectorvectorint res count(s); // 输出结果 int n res.size(); for (int i 0; i n; i) { cout res[i][0] : res[i][1]; if (i!n-1) { cout ; } } return 0; }JAVAimport java.util.*; public class Main { static int getKeyNum(char c) { if (c 0 c 9) return c - 0; return c - a 10; } static Listint[] count(String s) { MapCharacter, Integer charCount new HashMap(); int index 0, n s.length(); while (index n) { // u匹配规则 if (s.charAt(index) u index 1 n s.charAt(index 1) u) { charCount.put(j, charCount.getOrDefault(j, 0) 1); index 2; } // b匹配规则 else if (s.charAt(index) t index 1 n s.charAt(index 1) t) { charCount.put(b, charCount.getOrDefault(b, 0) 1); index 2; } else { char c s.charAt(index); charCount.put(c, charCount.getOrDefault(c, 0) 1); index; } } Listint[] res new ArrayList(); for (Map.EntryCharacter, Integer e : charCount.entrySet()) { res.add(new int[]{getKeyNum(e.getKey()), e.getValue()}); } // 排序次数降序 key升序 res.sort((a, b) - { if (a[1] b[1]) return a[0] - b[0]; return b[1] - a[1]; }); return res; } public static void main(String[] args) { Scanner sc new Scanner(System.in); String s sc.next(); Listint[] res count(s); for (int i 0; i res.size(); i) { System.out.print(res.get(i)[0] : res.get(i)[1]); if (i ! res.size() - 1) System.out.print( ); } } }Pythonimportsysdefget_key_num(c):if0c9:returnord(c)-ord(0)returnord(c)-ord(a)10defcount(s):char_count{}i0nlen(s)whilein:# uu - jifi1nands[i]uands[i1]u:char_count[j]char_count.get(j,0)1i2# tt - belifi1nands[i]tands[i1]t:char_count[b]char_count.get(b,0)1i2else:char_count[s[i]]char_count.get(s[i],0)1i1res[(get_key_num(k),v)fork,vinchar_count.items()]# 排序次数降序 key升序res.sort(keylambdax:(-x[1],x[0]))returnresif__name____main__:ssys.stdin.readline().strip()rescount(s)print( .join(f{k}:{v}fork,vinres))JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});functiongetKeyNum(c){if(c0c9)returnc.charCodeAt(0)-48;returnc.charCodeAt(0)-9710;}functioncount(s){letmapnewMap();leti0,ns.length;while(in){// uu - jif(i1ns[i]us[i1]u){map.set(j,(map.get(j)||0)1);i2;}// tt - belseif(i1ns[i]ts[i1]t){map.set(b,(map.get(b)||0)1);i2;}else{map.set(s[i],(map.get(s[i])||0)1);i;}}letres[];for(let[k,v]ofmap.entries()){res.push([getKeyNum(k),v]);}// 排序次数降序 key升序res.sort((a,b){if(a[1]b[1])returna[0]-b[0];returnb[1]-a[1];});returnres;}rl.on(line,(line){letsline.trim();if(!s)return;letrescount(s);console.log(res.map(x${x[0]}:${x[1]}).join( ));rl.close();});Gopackagemainimport(fmtsort)funcgetKeyNum(cbyte)int{ifc0c9{returnint(c-0)}returnint(c-a)10}funccount(sstring)[][]int{charCount:map[byte]int{}n:len(s)index:0forindexn{// u匹配规则ifindex1ns[index]us[index1]u{charCount[j]index2}elseifindex1ns[index]ts[index1]t{charCount[b]index2}else{charCount[s[index]]index}}res:make([][]int,0)fork,v:rangecharCount{resappend(res,[]int{getKeyNum(k),v})}// 自定义排序sort.Slice(res,func(i,jint)bool{ifres[i][1]res[j][1]{returnres[i][0]res[j][0]}returnres[i][1]res[j][1]})returnres}funcmain(){varsstringfmt.Scan(s)res:count(s)fori:0;ilen(res);i{fmt.Printf(%d:%d,res[i][0],res[i][1])ifi!len(res)-1{fmt.Print( )}}}C语言#includestdio.h#includestring.h#includestdlib.hintgetKeyNum(charc){if(c0c9)returnc-0;returnc-a10;}typedefstruct{intkey;intval;}Node;intcmp(constvoid*a,constvoid*b){Node*x(Node*)a;Node*y(Node*)b;// 按 val 降序if(x-val!y-val){returny-val-x-val;}// val相同按 key 升序returnx-key-y-key;}//voidcount(char*s,Node res[],int*size){intcnt[256]{0};intnstrlen(s);intindex0;while(indexn){// u匹配规则if(index1ns[index]us[index1]u){cnt[j];index2;}elseif(index1ns[index]ts[index1]t){cnt[b];index2;}else{cnt[(unsignedchar)s[index]];index;}}intk0;for(inti0;i256;i){if(cnt[i]0){res[k].keygetKeyNum((char)i);res[k].valcnt[i];k;}}*sizek;qsort(res,k,sizeof(Node),cmp);}intmain(){chars[1000];scanf(%s,s);Node res[256];intsize0;count(s,res,size);for(inti0;isize;i){printf(%d:%d,res[i].key,res[i].val);if(i!size-1)printf( );}return0;}