当前位置: 首页 > 面试题库 >

Python-查找第二个最小数字

艾弘义
2023-03-14
问题内容

我在此站点上找到此代码以查找第二大数字:

def second_largest(numbers):
    m1, m2 = None, None
    for x in numbers:
        if x >= m1:
            m1, m2 = x, m1
        elif x > m2:
            m2 = x
    return m2

是否可以修改此代码以找到第二个 最小的 数字?所以举个例子

print second_smallest([1, 2, 3, 4])
2

问题答案:

确实可以修改该函数以找到第二个最小的函数:

def second_smallest(numbers):
    m1, m2 = float('inf'), float('inf')
    for x in numbers:
        if x <= m1:
            m1, m2 = x, m1
        elif x < m2:
            m2 = x
    return m2

旧版本依赖于Python
2实施细节,该细节None始终排在其他任何东西之前(因此测试为“较小”);我取代了使用float('inf')作为前哨,为无穷大总是测试,
更大的
比任何其它号码。理想情况下,应该使用原始函数float('-inf')代替原始函数None,以免与其他Python实现可能不共享的实现细节相关联。


演示:

>>> def second_smallest(numbers):
...     m1, m2 = float('inf'), float('inf')
...     for x in numbers:
...         if x <= m1:
...             m1, m2 = x, m1
...         elif x < m2:
...             m2 = x
...     return m2
... 
>>> print second_smallest([1, 2, 3, 4])
2

在您发现的函数之外,使用该heapq.nsmallest()函数从迭代器返回两个最小值,并从这两个中选择第二个(或最后一个)值几乎一样有效:

from heapq import nsmallest

def second_smallest(numbers):
    return nsmallest(2, numbers)[-1]

像上面的实现一样,这是一个O(N)解决方案。保持堆变量的每一步都需要logK时间,但是K在这里是一个常数(2)!无论您做什么, 都不要使用sort
;这需要O(NlogN)时间。



 类似资料:
  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 问题内容: 因此,我需要使用递归在整数列表中找到第二个最小的数字,但是我一生都无法想出办法。我可以使用以下方法找到最小的数字: 谁能指出我正确的方向? 问题答案: 这是一个不使用或的简短实现。当列表中有重复值时,它也适用。

  • 问题内容: 我正在尝试创建两种方法,一种找到对象数组中的最小值,另一种找到对象数组中第二个最小值。 我已经这样写了两个 我已经找到了如何找到最小的值,我只需要找到第二个最小的值,我不确定怎么做。 有任何想法吗?谢谢! 问题答案: 像这样的东西:

  • 我试图从BST中删除最小节点,所以我在树中搜索,直到得到最小值(当root.leftnode为None时),然后将root.rightnode设置为根本身,以继续BST。 问题是,当我这样做之后检查树时,它不会显示曾经发生过的删除。 有人可以指出我正确的方向吗,任何建议都值得赞赏。

  • 题目描述 输入n个整数,输出其中最小的k个。 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。 至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可。因此,总的时间复杂度:O(n * log n)+O(k)=O(n * log n)。

  • 问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果: