通过率 71% · 提交 494 · 通过 353
小慕在整理一份项目数据时,发现一个由连续正整数组成的序列,被拼接成了一个字符串,然后字符串中的部分字符被打乱了顺序。例如,序列8 9 10 11 12,拼接后得到字符串89101112,打乱部分字符后变成90811211,原本的正整数10就被拆成了0和1。现在,小慕拿到了一个按上述规则后的字符串,需要将其还原成原始的,并输出该序列中最小的那个数字。
这类题属于华为 OD 机考真题方向中「100分 / 字符串」方向的高频题型,通常考察对「100分 / 字符串」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入一行,为打乱字符的字符串和正整数序列的长度,两者间用空格分隔,字符串长度不超过200,正整数不超过1000,保证输入可以还原成唯一序列。
输出一个数字,为序列中最小的数字。
示例 1
输入示例
19801211 5
输出示例
8
还原出的序列为 8 9 10 11 12,故输出 8
示例 2
输入示例
432111111111 4
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
直接从序列 s 中进行判断,较难完成。 考虑到数据量不大,可以通过穷举的方式来完成。
对于 1 到 1000 的数字 num,考虑长度为 n 的序列:
将该序列中的每一个数字转化为字符串,再统计每一个数字字符出现的个数,用哈希表 cnt_new 来记录。 原序列 s 中的数字字符,用另外一个哈希表 cnt 来记录。即:
或者更加简洁的写法:
若发现存在 cnt_new == cnt,说明此时 num 是所寻找的序列的第一个数字。
这是一种相对而言比较暴力的解法,但也足以通过所有用例。
如果想要进一步优化,可以使用固定滑窗的做法。 固定长度为序列长度 n 的窗口,对正整数序列 1 2 3 ... 1000 进行滑动,构建一个 win_cnt 表示窗口中各个数字出现的次数。 左边的数字离开,则在 win_cnt 中减去对应的频次;右边的数字加入,则在 win_cnt 中加入对应的频次。
感兴趣的同学可以自行完成上述代码。
复杂度分析 设 n 为序列长度(输入的第二个数),候选起始数的枚举上界为 1000,d 为单个数字的位数(不超过 4)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
111
还原出的序列为 111 112 113 114,故输出 111
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有