华为OD机试真题 新系统 - 失灵的键盘 (JavaPyCC++JsGo)

3 阅读3分钟

失灵的键盘

2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

有一个键盘有 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一个

解题思路

核心思想

题目描述中指出:失灵的 j 键会输出连续的 uu,失灵的 b 键会输出连续的 tt。而且因为 ujtb 的转义规则,输入字符串中每出现一次连续的 uu 就意味着按了一次 j,每出现一次连续的 tt 就意味着按了一次 b。 因此,我们可以直接将字符串中所有的 "uu" 替换为 "j",将所有的 "tt" 替换为 "b"。替换后的字符串就完美反映了按键的实际过程。

随后,我们需要统计各个字符出现的频率,并进行排序和转义输出。 排序规则如下:

  1. 首先按照按键次数降序排序。
  2. 次数相同时,按照按键对应的字符 ASCII 码升序排序(失灵按键 bj 的对应字符也就是 bj 本身)。

最后,根据题目给定的映射规则:

  • 数字 0 ~ 9 映射为 0 ~ 9
  • 小写字母 a ~ z 映射为 10 ~ 35(即 字符的 ASCII 值 - 'a'的 ASCII 值 + 10)。

复杂度分析

  • 时间复杂度O(NlogN)O(N \log N),其中 NN 是字符串的长度。字符串替换操作时间复杂度为 O(N)O(N),统计频次为 O(N)O(N),最后对不超过 36 种字符进行排序的时间复杂度为 O(ClogC)O(C \log C) (C<=36),因此总体时间复杂度极低,接近 O(N)O(N)
  • 空间复杂度O(N)O(N),用于存储替换后的字符串以及哈希表统计频次。