两个查找第二个最低分数的python代码

两个查找第二个最低分数的python代码,python,Python,我被告知要解决这个黑客问题: 打印物理成绩第二低的任何学生的姓名;如果有多个学生,按字母顺序排列他们的名字,并将每个名字打印在新行上 问题链接: 现在,除了HackerRank页面上提到的约束之外,还有其他约束: 不使用lambda函数 最少或不使用列表函数(除排序外) 尽量不要创建附加(重复)列表(一个没有原始列表最小值的新列表。因此,此列表的最小值是原始列表的第二个最小值。) 这是我的第一个代码。 尽量使其基本(不使用许多内置函数) 这个代码是完全正确的。对所有测试用例都运行良好 现在,我

我被告知要解决这个黑客问题:

打印物理成绩第二低的任何学生的姓名;如果有多个学生,按字母顺序排列他们的名字,并将每个名字打印在新行上

问题链接:

现在,除了HackerRank页面上提到的约束之外,还有其他约束:

  • 不使用lambda函数

  • 最少或不使用列表函数(除排序外)

  • 尽量不要创建附加(重复)列表(一个没有原始列表最小值的新列表。因此,此列表的最小值是原始列表的第二个最小值。)

  • 这是我的第一个代码。 尽量使其基本(不使用许多内置函数)

    这个代码是完全正确的。对所有测试用例都运行良好

    现在,我不明白为什么代码1没有涵盖所有情况,代码2是如何正确运行的

    什么,代码1有错吗?

    注:
    我见过许多正确的替代代码(来自Geeksforgeks和StackOverFlow)我不想链接到任何能给我正确答案的新代码。相反,我想知道代码1有什么问题?

    第一次代码提取中的致命缺陷是设置
    min
    smin
    的位置:

    #选择最小值和第二个最小值构成前两个分数。
    如果数据[0][1]>数据[1][1]:
    smin=数据[0][1]
    分钟=数据[1][1]
    其他:
    分钟=数据[0][1]
    smin=数据[1][1]
    
    如果前两个人的分数相同,会发生什么<代码>分钟和
    smin
    将是相同的

    考虑以下输入:

    3
    foo
    10
    bar
    10
    baz
    50
    
    当您开始考虑for循环中的
    baz
    时,您将有
    mins==10
    smin==10

    因此,当您试图确定
    baz
    的分数是否应该是第二个最小值时,出现了一个问题:

    elif data[i][1]>min和data[i][1]
    因为
    mins
    smin
    是相同的,所以不会为
    smin
    设置新值


    您的第二个程序通过采用不同的方法来解决此问题。希望这有帮助

    如果前两个分数相等且为负怎么办

    For example: [['John': -15], ['Nic': -15], ['Mike': 20]]
    
    在这种情况下,您的代码将
    最小值
    第二个最小值
    设置为
    -15

    if data[0][1] > data[1][1]:
        smin = data[0][1]
        mins = data[1][1]
    else:
        mins = data[0][1]
        smin = data[1][1]
    
    然后在代码的这一部分,您的
    smin
    -15

    for i in data:
        if i[1] == smin:
            names.append(i[0])
    
    但是
    第二个最小值实际上是
    20

    您只需在
    名称
    列表中添加
    ['John','Nic']

    if data[0][1] > data[1][1]:
        smin = data[0][1]
        mins = data[1][1]
    else:
        mins = data[0][1]
        smin = data[1][1]
    
    for i in data:
        if i[1] == smin:
            names.append(i[0])