第二高分

时间:2018-12-04 06:11:48

标签: python python-3.x

样本输入

5
2 3 6 6 5

样本输出

5

错误

Traceback (most recent call last):
     File "solution.py", line 2, in <module>
       li=[input() for i in range(n)]
     File "solution.py", line 2, in <listcomp>
       li=[input() for i in range(n)]
   EOFError: EOF when reading a line

当我在pyCharm中编写此代码时,它可以正常工作,但是当我在Hackerrank.com中编写此代码时,它向我显示错误。

n = int(input())
li=[input() for i in range(n)]

mx =  (max(li)) # it gives max number from list
li.remove(mx) # then i remove max no from the list
sec_mx = max(li) # now the second max is the new_max as you all knows
print(sec_mx)

3 个答案:

答案 0 :(得分:2)

在列表中获得输入后,就可以使用冗长的内容:

scores = [2, 3, 6, 6, 5]

scores.sort(reverse = True)
max = scores[0]
second_best = scores[scores.count(max)]

print(second_best) #=> 5

答案 1 :(得分:1)

input会一直读取,直到您换行。这适用于第一行,因为它是一个整数,后跟一个换行符,但不适用于第二行,因为分隔符现在是一个空格。在pyCharm中起作用的原因很可能是您用换行符分隔了输入内容,这与网站提供的内容相反。

您可能正在寻找更类似的东西

li = [int(x) for x in input().split()]

请注意,在有意义地调用列表上的int之前,需要将所有元素都转换为max。否则,您将需要对字符串进行字典编法比较,这将对多于一个数字的数字产生意外结果。

要注意的另一件事是list.remove仅除去最大值的第一次出现。这意味着即使纠正了错误,您的代码也会产生6而不是5。

我可以想到多种解决方法:

  1. 继续删除第一个最大值,直到出现错误为止。
  2. 以相反的顺序排列li。返回不等于li[0]的第一个元素。
  3. 在预先排序的列表上使用二等分:

    from bisect import bisect_left
    ...
    li.sort()
    ind = bisect_left(li, li[-1]) - 1
    second_max = li[ind]
    

答案 2 :(得分:0)

您只需对列表进行排序,就可以从最近的第二个索引(即-2)访问第二个最大的数字

li = [12, 45, 45, 2, 41, 31, 10, 8, 6, 4]
print(sorted(set(li))[-2])

OR

sorted_list = sorted(set(li), reverse=True)
print(sorted_list[1])