Python查找列表第二小整数代码检查及简化方案咨询
原有代码的核心问题
你当前写的实现有几个明显的缺陷,没法满足题目要求:
- 硬编码了列表长度,多层嵌套的if判断最多只会比较到第5个元素,根本适配不了「数量未知的输入」这个要求
- 比较逻辑有漏洞,嵌套if的写法只要遇到前一个数比后一个数小,就不会继续往后遍历比较,很容易漏掉更小的值
- 缩进错误导致
print语句被放在了else分支下,部分场景下不会输出任何结果 - 直接用
list做变量名,会覆盖Python内置的列表类型,属于不规范的写法
简化实现方式
简洁写法(推荐日常使用)
因为题目明确约定所有输入数字互不重复,不需要手动写多层比较逻辑,直接用Python内置函数就能实现,代码量极少,逻辑清晰不会出错,适配任意长度≥2的输入。
如果想贴合你原本「先移除最小值,再找剩余列表最小值」的思路,可以这么写:
# 如果是接收控制台输入,可以替换成 nums = list(map(int, input().split())) nums = [10, 12, 1, 3, 2] nums.remove(min(nums)) print(min(nums))
更简单的方式是直接对列表排序,升序排序后索引为1的元素就是第二小的整数:
nums = [10, 12, 1, 3, 2] print(sorted(nums)[1])
这两种写法运行示例列表都会输出正确结果2。
高性能写法(适配超大数据量场景)
如果输入的数字量级很大,排序、多次调用min函数的时间复杂度是O(nlogn),可以用一次遍历的方式把时间复杂度降到O(n),只需要遍历一遍列表,动态维护最小值和第二小值两个变量即可,还能直接利用题目给出的「第一个数始终小于第二个数」的条件做初始化,不需要额外处理边界:
nums = [10, 12, 1, 3, 2] # 利用题目给定的条件初始化两个变量 smallest = nums[0] second_smallest = nums[1] for num in nums[2:]: if num < smallest: second_smallest = smallest smallest = num elif num < second_smallest: second_smallest = num print(second_smallest)
这个写法不需要修改原列表,也不需要做全量排序,遍历一次就能得到正确结果。
内容的提问来源于stack exchange,提问作者Hoi2022
相关产品推荐
相关产品推荐

