You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数字重排求最小整数: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个用例失败的原因,寻求解决方案。


问题分析与解决方案

你的代码存在两个核心问题:

  1. 逻辑错误:最小非零数字的处理方式错误
    当最小非零数字出现多次时,你将所有该数字都放在0的前面,这会导致生成的数不是最小的。比如输入1100,你的代码输出1100,但正确的最小数应该是1001——只需要把一个最小非零数字放在开头,接着放所有0,最后放剩余的数字(包括剩下的最小非零数字),这样得到的数才是最小的。

  2. 依赖字典插入顺序
    在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的情况时:
    1. 取出最小的非零数字,放一个在开头。
    2. 接着放所有的0,保证高位尽可能小。
    3. 再放剩余的最小非零数字,最后按从小到大顺序放其他数字。
  • 不存在0的情况时,直接按数字从小到大拼接即可。
  • 不依赖字典的插入顺序,通过有序列表控制输出顺序,兼容所有Python版本。

内容的提问来源于stack exchange,提问作者Srinivasan A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:59:55