**数字系统转换器**

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

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

题目描述

在一个特殊的数学系统中,每个数字都有其独特的表示方式。给定两个不同的数字字符集和一个数字字符串,你需要将这个数字从一个字符系统转换到另一个字符系统。实现一个函数,将使用源字符集表示的数字转换为使用目标字符集表示的数字。

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

补充说明

  • 1≤num.length≤100
  • 2≤sourceDigits.length≤36
  • 2≤targetDigits.length≤36
  • sourceDigitstargetDigits 由不同的字符组成,且不包含重复字符
  • num 中的所有字符都存在于 sourceDigits
  • 输入保证是有效的,不会出现非法字符
  • 转换结果不应包含前导零,除非数字本身就是 0

示例1

输入

101,01,0123456789

输出

5

说明

解释: 二进制 "101" 转换为十进制是 "5"

示例2

输入

ff,0123456789abcdef,0123456789

输出

255

说明

解释: 十六进制 "ff" 转换为十进制是 "255"

示例3

输入

100,01,0123456789abcdef

输出

4

说明

解释: 二进制 "100" 转换为十六进制是 "4"

示例4

输入

7,0123456789,01

输出

111

说明

解释: 十进制 "7" 转换为二进制是 "111"

示例5

输入

10012,01234,012

输出

212102

说明

解释: 五进制 "10012" 转换为三进制是 "212102"

解题思路

核心思想

最直观的方法是先把 num 转成十进制整数,再转成目标进制。但 num.length 最大为 100,数值可能非常大,部分语言的普通整数会溢出。

更通用的做法是直接做“进制长除法”:把 num 按源字符集转换成源进制下的数字数组,然后反复用目标进制的基数去除这个大数。每次除法得到的余数,就是目标进制从低位到高位的一个数字。

算法步骤

  1. 按示例格式读取一行输入,用英文逗号切分出 numsourceDigitstargetDigits
  2. 建立源字符到数值的映射,例如 sourceDigits[i] 的值为 i
  3. num 转成源进制数字数组。
  4. 如果数组表示的数值为 0,直接输出 targetDigits[0]
  5. 当数字数组不为空时,执行一次大数除以 targetBase
    • 从高位到低位处理,维护当前余数。
    • 商的前导 0 不保留。
    • 本轮最终余数就是目标进制的一位。
  6. 重复除法直到商为空,将得到的余数对应字符反转后输出。

复杂度分析

L 为输入数字长度,目标表示长度为 R

  • 每次除法最多扫描当前数字数组一遍,时间复杂度为 O(L * R)
  • 需要保存当前数字数组和结果数组,空间复杂度为 `O(L +
THE END