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

CodeWars「Weight for weight」题目Python代码测试报错:相同权重数值顺序反转问题

问题排查与解决方案

首先,咱们来拆解下你代码里的核心问题:你手动实现的选择排序逻辑,在处理权重相同的元素时,因为用了<=的判断条件,会每次选中当前剩余列表里最后一个遇到的同权重元素,最终导致同权重元素的顺序被反转,这就不符合题目的排序要求啦。

CodeWars的「Weight for weight」题目明确规定:当两个数字的权重(各位数字之和)相同时,需要按照它们的字符串字典序排序(比如"103"和"301"权重都是4,"103"应该排在"301"前面),而你的手动排序逻辑既没处理这个规则,还因为遍历覆盖的问题搞反了顺序。

修正后的简洁方案

其实Python内置的sorted()函数就能完美解决这个问题,我们只需要指定排序的key参数,让排序优先按权重排序,权重相同时按字符串本身的字典序排序:

def order_weight(strng):
    # 分割字符串,自动过滤多余空格(比如开头/结尾空格、连续空格)
    weights = strng.split()
    # 定义排序规则:先算各位数字和(权重),再用原字符串作为次要排序依据
    def sort_key(num_str):
        weight = sum(int(char) for char in num_str)
        return (weight, num_str)
    # 按规则排序后拼接成结果字符串
    return ' '.join(sorted(weights, key=sort_key))

为什么这个方案能解决问题?

  • 符合题目规则:当权重相同时,sorted()会自动按字符串的字典序升序排列,完全匹配题目的要求。
  • 效率更高:Python内置的排序是Timsort算法,时间复杂度为O(n log n),而你手动实现的选择排序是O(n²),数据量大时差距会很明显。
  • 鲁棒性更强:split()不带参数时会自动分割任意空白符,能处理输入里的多余空格情况。

原问题的具体验证

比如输入"103 301",你的原代码遍历过程中会先记录"103"的权重4,接着遇到"301"权重也是4,因为<=的判断会覆盖之前的记录,最终先把"301"加入结果列表,再加入"103",输出顺序反转成"301 103",这就不符合要求。而修正后的代码会输出正确的"103 301"。

内容的提问来源于stack exchange,提问作者White Fox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:52:28