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

求排查climbingLeaderboard算法'int object is not iterable'报错及逻辑问题

问题排查与修复:climbingLeaderboard函数的稠密排名实现

一、先解决报错:'int object is not iterable'

你遇到的这个错误,核心原因是函数提前返回了单个整数,而不是返回包含所有排名的数组。看你的代码,处理Alice的第一个分数时,只要满足某个条件就直接return,比如alice第一个分数是70,函数会直接return 4。但调用方大概率是期望得到一个数组(比如[4,3,1]),如果尝试遍历这个返回的整数,自然会抛出"int不能被迭代"的错误。

二、你的算法逻辑里还有这些坑

1. 去重逻辑容易出问题

你用嵌套循环遍历数组并删除重复元素的方式,会因为数组长度动态变化导致索引混乱。比如原数组是[100,90,90,90,80],当你删除第一个重复的90后,数组长度变短,后续的循环索引会错位,可能漏删部分重复项,甚至触发索引越界。

2. Alice分数处理的逻辑漏洞

  • 提前return导致只处理第一个分数:每处理一个Alice的分数就直接return,后面的分数根本没机会被处理,自然得不到完整的排名数组。
  • 条件判断顺序不合理:比如alice[k]>scores[0](分数大于最高分)的判断放在了中间,会先做一轮无用的遍历,效率低还容易出错。
  • 边界情况没覆盖:比如Alice分数等于最低分的情况,你的逻辑里没有明确处理,还有分数处于两个排名分数之间的边界判断也有疏漏。

三、修正后的完整实现

我优化了去重逻辑,还用二分查找提升了排名查询的效率(尤其适合大数据量的场景),同时修复了所有逻辑漏洞:

def climbingLeaderboard(scores, alice):
    # 快速去重并保持降序:转集合去重后,排序为从高到低
    unique_scores = sorted(list(set(scores)), reverse=True)
    rank_count = len(unique_scores)
    alice_ranks = []
    
    for current_score in alice:
        # 情况1:分数大于等于最高分,直接排第1
        if current_score >= unique_scores[0]:
            alice_ranks.append(1)
            continue
        # 情况2:分数低于最低分,排名是去重后的长度+1
        if current_score < unique_scores[-1]:
            alice_ranks.append(rank_count + 1)
            continue
        # 二分查找快速定位排名位置
        left, right = 0, rank_count - 1
        found = False
        while left <= right:
            mid = (left + right) // 2
            if unique_scores[mid] == current_score:
                alice_ranks.append(mid + 1)
                found = True
                break
            elif unique_scores[mid] > current_score:
                left = mid + 1
            else:
                right = mid - 1
        # 没找到相等的分数,说明在两个分数之间,排名是left+1
        if not found:
            alice_ranks.append(left + 1)
    
    return alice_ranks

# 测试示例
scores = [100,90,90,80]
alice = [70,80,105]
print(climbingLeaderboard(scores, alice))  # 输出: [4, 3, 1]

四、代码细节说明

  1. 高效去重:用set(scores)一键去重,再sorted(..., reverse=True)生成降序的无重复分数数组,比你原来的嵌套循环删除高效得多,还不会出现索引混乱的问题。
  2. 二分查找优化:把原来的线性遍历改成二分查找,时间复杂度从O(n*m)降到了O(m log n),当排行榜分数很多时,速度会快很多。
  3. 完整收集排名:用alice_ranks数组逐个收集每个分数的排名,最后统一返回,彻底解决了提前return的问题。
  4. 全边界覆盖:覆盖了分数大于等于最高分、低于最低分、等于某个排名分数、处于两个分数之间的所有情况,逻辑更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:09:07