求排查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]
四、代码细节说明
- 高效去重:用
set(scores)一键去重,再sorted(..., reverse=True)生成降序的无重复分数数组,比你原来的嵌套循环删除高效得多,还不会出现索引混乱的问题。 - 二分查找优化:把原来的线性遍历改成二分查找,时间复杂度从O(n*m)降到了O(m log n),当排行榜分数很多时,速度会快很多。
- 完整收集排名:用
alice_ranks数组逐个收集每个分数的排名,最后统一返回,彻底解决了提前return的问题。 - 全边界覆盖:覆盖了分数大于等于最高分、低于最低分、等于某个排名分数、处于两个分数之间的所有情况,逻辑更严谨。
内容的提问来源于stack exchange,提问作者dias
相关产品推荐
相关产品推荐

