如何编写列表元素替换为剩余次大值的函数 修复替换后未删元素问题
问题分析
你的代码核心问题有两点:
- 查找逻辑错误:遍历原列表时找的是第一个位置靠前的大于当前值的元素,而非数值上大于当前值的最小元素,导致元素2错误匹配到了5而非正确的3
- 没有做已使用元素的排除逻辑,同一个大值可以被多次匹配,输出结果不符合要求
修改后可运行代码
def replaceNextLargest(numLst): # 拷贝原列表后升序排序,便于快速找到最小的符合要求的大值 sorted_nums = sorted(numLst.copy()) result = [] for current in numLst: matched = False # 遍历升序列表找第一个大于当前值的元素 for i in range(len(sorted_nums)): if sorted_nums[i] > current: result.append(sorted_nums[i]) # 弹出已使用的元素,避免重复匹配 sorted_nums.pop(i) matched = True break if not matched: result.append(-1) return result # 测试用例验证 print(replaceNextLargest([5, 7, 3, 2, 8])) print(replaceNextLargest([2, 3, 4, 5])) print(replaceNextLargest([1, 0, -1, 8, -72]))
代码逻辑说明
- 先对原列表的拷贝做升序排序,从小到大遍历可以快速定位到大于当前值的最小元素
- 每次找到匹配的大值后,直接将该值从排序的列表中移除,确保不会被其他元素重复使用
- 遍历完排序后列表仍未找到符合要求的元素,就向结果中添加-1
如果需要更高的执行效率,可以用二分查找替代遍历升序列表的逻辑,时间复杂度可以从O(n²)优化到O(nlogn)。
内容的提问来源于stack exchange,提问作者HuiEe Wong
相关产品推荐
相关产品推荐

