当前位置: 首页 > news >正文

华为OD机试真题 新系统 - 失灵的键盘(C/C++/Py/Java/Js/Go)

失灵的键盘

华为OD机试真题 华为OD上机考试真题 4月15号 100分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

有一个键盘有 2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下:

  • 按下 j 键一次,屏幕上显示 u(两个连续的 u );按下 b键一次,屏幕上显示 t(两个连续的 t)
  • u键和 t键是好的,按下 u键一次时,屏幕只会显示一次 u(正常按键);按下 t键一次时,屏幕只会显示一次 t (正常按键)
  • 假定屏幕上连续显示两个 t 一定是按了一次 b 键,而不是两次 t键;假定按键 t之后不会紧接着按键 b,即 tttt转义为两个 b,而不可能是 tbt;u和 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匹配为两个jj,a一个

题解

思路:模拟 + 自定义排序

  1. 按照题目意思就是将连续出现的uutt分别看作jb处理即可。
  2. 明白1之后,接下来使用哈希表或者类似结构,循环遍历输入字符串,统计各个字符出现的数量
  3. 将统计之后的数据转换为数组,进行自定义排序,排序规则为按照按键次数降序输出,次数相同的按键按照对应字符的升序排序.
  4. 然后返回结果即可。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int getKeyNum(char c) { if ('0' <=c && c <= '9') { return c - '0'; } return c - 'a' + 10; } vector<vector<int>> count(string s) { map<char, 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++; } } vector<vector<int>> res; for(auto &p : charCount) { res.push_back({getKeyNum(p.first), p.second}); } // 自定义排序 sort(res.begin(), res.end(), [](vector<int> &a, vector<int> &b) { return a[1] > b[1]; }); return res; } int main() { string s; cin >> s; vector<vector<int>> 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; }

JAVA

import java.util.*; public class Main { static int getKeyNum(char c) { if (c >= '0' && c <= '9') return c - '0'; return c - 'a' + 10; } static List<int[]> count(String s) { Map<Character, 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++; } } List<int[]> res = new ArrayList<>(); for (Map.Entry<Character, 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(); List<int[]> 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(" "); } } }

Python

importsysdefget_key_num(c):if'0'<=c<='9':returnord(c)-ord('0')returnord(c)-ord('a')+10defcount(s):char_count={}i=0n=len(s)whilei<n:# uu -> jifi+1<nands[i]=='u'ands[i+1]=='u':char_count['j']=char_count.get('j',0)+1i+=2# tt -> belifi+1<nands[i]=='t'ands[i+1]=='t':char_count['b']=char_count.get('b',0)+1i+=2else:char_count[s[i]]=char_count.get(s[i],0)+1i+=1res=[(get_key_num(k),v)fork,vinchar_count.items()]# 排序:次数降序 + key升序res.sort(key=lambdax:(-x[1],x[0]))returnresif__name__=="__main__":s=sys.stdin.readline().strip()res=count(s)print(" ".join(f"{k}:{v}"fork,vinres))

JavaScript

constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});functiongetKeyNum(c){if(c>='0'&&c<='9')returnc.charCodeAt(0)-48;returnc.charCodeAt(0)-97+10;}functioncount(s){letmap=newMap();leti=0,n=s.length;while(i<n){// uu -> jif(i+1<n&&s[i]==='u'&&s[i+1]==='u'){map.set('j',(map.get('j')||0)+1);i+=2;}// tt -> belseif(i+1<n&&s[i]==='t'&&s[i+1]==='t'){map.set('b',(map.get('b')||0)+1);i+=2;}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)=>{lets=line.trim();if(!s)return;letres=count(s);console.log(res.map(x=>`${x[0]}:${x[1]}`).join(" "));rl.close();});

Go

packagemainimport("fmt""sort")funcgetKeyNum(cbyte)int{ifc>='0'&&c<='9'{returnint(c-'0')}returnint(c-'a')+10}funccount(sstring)[][]int{charCount:=map[byte]int{}n:=len(s)index:=0forindex<n{// u匹配规则ifindex+1<n&&s[index]=='u'&&s[index+1]=='u'{charCount['j']++index+=2}elseifindex+1<n&&s[index]=='t'&&s[index+1]=='t'{charCount['b']++index+=2}else{charCount[s[index]]++index++}}res:=make([][]int,0)fork,v:=rangecharCount{res=append(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;i<len(res);i++{fmt.Printf("%d:%d",res[i][0],res[i][1])ifi!=len(res)-1{fmt.Print(" ")}}}

C语言

#include<stdio.h>#include<string.h>#include<stdlib.h>intgetKeyNum(charc){if(c>='0'&&c<='9')returnc-'0';returnc-'a'+10;}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};intn=strlen(s);intindex=0;while(index<n){// u匹配规则if(index+1<n&&s[index]=='u'&&s[index+1]=='u'){cnt['j']++;index+=2;}elseif(index+1<n&&s[index]=='t'&&s[index+1]=='t'){cnt['b']++;index+=2;}else{cnt[(unsignedchar)s[index]]++;index++;}}intk=0;for(inti=0;i<256;i++){if(cnt[i]>0){res[k].key=getKeyNum((char)i);res[k].val=cnt[i];k++;}}*size=k;qsort(res,k,sizeof(Node),cmp);}intmain(){chars[1000];scanf("%s",s);Node res[256];intsize=0;count(s,res,&size);for(inti=0;i<size;i++){printf("%d:%d",res[i].key,res[i].val);if(i!=size-1)printf(" ");}return0;}
http://www.cnnetsun.cn/news/1924952.html

相关文章:

  • HCL模拟器实战:从零搭建华三虚拟网络实验室
  • 终极指南:用Chinese-ERJ LaTeX模板快速搞定《经济研究》投稿格式
  • 2026 年 AI 智能体领域的残酷竞争:从 OpenClaw、MoltBook 到 Hermes
  • 3D打印老手也容易忽略的细节:Dreamer Nx WIFI打印中的模型预处理与切片参数优化
  • 神界原罪2模组管理终极指南:告别模组混乱,开启流畅游戏体验
  • STM32WLE5CCU6实战:从官方WL55JC例程到国产CN470频段,手把手移植LoRaWAN节点程序
  • 告别抖动!STM32控制28BYJ-48步进电机的三种励磁方式详解与选型
  • 告别玄学调参:手把手教你用SCCB协议配置OV5640寄存器(附完整代码)
  • 【生成式AI可观测性白皮书】:从Prompt注入到推理退化,构建具备因果推断能力的智能告警闭环
  • 5个颠覆性策略:NocoDB分布式架构优化实战突破
  • LinuxCNC终极实战指南:开源数控系统深度解析与高效部署
  • 从图论到网络:Dijkstra与Bellman-Ford算法如何塑造互联网的路径选择
  • Python26_并发协程
  • Midscene.js:如何用自然语言命令实现跨平台UI自动化测试
  • 3步掌握RePKG:免费解锁Wallpaper Engine隐藏资源
  • 百度云自动化管理终极指南:bypy助力企业高效云存储运维
  • Kali更新报错127.0.0.2?手把手教你清理磁盘空间+永久修复resolv.conf配置
  • SendCenterMsg颜色代码速查表:让你的传奇登录器公告更醒目
  • 3分钟免费汉化Figma:设计师必备的中文界面解决方案
  • 告别库版本困惑:手把手教你区分并获取STM32 MotorControl Workbench 5.4.3的FULL与非FULL版本
  • 别再乱拉镜像了!手把手教你读懂Docker镜像名称里的‘暗号’
  • 抖音无水印批量下载工具:如何轻松保存你喜欢的视频内容?
  • 2026最权威的十大AI学术工具解析与推荐
  • Source Han Serif CN 开源中文字体:7种字重免费商用的实用指南
  • 从原理到实践:基于TI MMWCAS级联评估板的毫米波雷达系统开发指南
  • 解锁网易云音乐隐藏玩法:BetterNCM插件管理器一键安装全攻略
  • 终极vJoy虚拟摇杆解决方案:如何为Windows游戏开发打造专业级输入模拟
  • STM32CubeMX+HAL库搞定HX711压力传感器,从接线到校准的保姆级避坑指南
  • 从报文到代码:用Wireshark抓包逆向分析AUTOSAR CAN-TP协议栈的流控(FC)与连续帧(CF)机制
  • 3个核心能力:用Figma-to-JSON彻底打通设计与开发的数据壁垒