数字重排求最小整数:Python代码仅通过5/7测试用例需排查
问题描述
给定整数N(边界条件:1≤N≤9999999999),要求输出使用N的所有数字组成的最小可能整数。
- 输入格式:第一行输入整数N
- 输出格式:第一行输出生成的最小整数
示例输入输出
- 输入:45223,输出:22345
- 输入:48903012,输出:10023489
我的代码
a=input() c={} for i in a: if i in c: c[i]+=1 else: c[i]=1 v=dict(sorted(c.items())) k=list(v.keys()) u=list(v.values()) if k[0]=='0': m={k[1]:u[1],k[0]:u[0]} for i,j in v.items(): if i not in k[:2]: m[i]=j for i in m: print(i*m[i],end='') else: for i in v: print(i*v[i],end='')
遇到的问题
该代码仅通过了7个测试用例中的5个,由于测试用例锁定,无法排查剩余2个用例失败的原因,寻求解决方案。
问题分析与解决方案
你的代码存在两个核心问题:
逻辑错误:最小非零数字的处理方式错误
当最小非零数字出现多次时,你将所有该数字都放在0的前面,这会导致生成的数不是最小的。比如输入1100,你的代码输出1100,但正确的最小数应该是1001——只需要把一个最小非零数字放在开头,接着放所有0,最后放剩余的数字(包括剩下的最小非零数字),这样得到的数才是最小的。依赖字典插入顺序
在Python3.7之前的版本中,字典不保留插入顺序,遍历m时会导致数字顺序混乱,进而输出错误结果。
修正后的代码
a = input().strip() # 统计每个数字的出现次数 count = {} for num in a: count[num] = count.get(num, 0) + 1 # 按数字从小到大排序得到有序的数字列表 sorted_digits = sorted(count.keys()) if sorted_digits[0] == '0': # 取出最小的非零数字 first_non_zero = sorted_digits[1] # 构造结果:先放一个最小非零数字,再放所有0,再放剩余的数字 result = first_non_zero + '0' * count['0'] # 剩余的最小非零数字次数减1 count[first_non_zero] -= 1 # 如果还有剩余的最小非零数字,加入结果 if count[first_non_zero] > 0: result += first_non_zero * count[first_non_zero] # 处理剩下的数字(从第三个开始) for d in sorted_digits[2:]: result += d * count[d] else: # 没有0的情况,直接按顺序拼接 result = ''.join([d * count[d] for d in sorted_digits]) print(result)
代码解释
- 统计每个数字的出现次数,确保不遗漏任何数字。
- 当存在前导0的情况时:
- 取出最小的非零数字,放一个在开头。
- 接着放所有的0,保证高位尽可能小。
- 再放剩余的最小非零数字,最后按从小到大顺序放其他数字。
- 不存在0的情况时,直接按数字从小到大拼接即可。
- 不依赖字典的插入顺序,通过有序列表控制输出顺序,兼容所有Python版本。
内容的提问来源于stack exchange,提问作者Srinivasan A
相关产品推荐
相关产品推荐

