我试图在数组中找到第二大元素。我的代码可用于大多数输入,但对于某些输入,则失败。
另外,如果我输入[6, 6, 6, 5]
,则程序应输出5作为第二大而不是6。
对于[6,6,6,6,6,6,6,6,6,5]
,它打印的是6而不是5。
对于重复元素,它给出错误的结果。
# Given the participants' score sheet for your University Sports Day, you are required to find the runner-up score.
# You are given scores. Store them in a list and find the score of the runner-up.
if __name__ == '__main__':
n = int(input("Enter the total numbers: "))
arr = list(map(int, input("Enter the numbers: ").split()))
if arr[0] >= arr[1]:
first_max = arr[0]
second_max = arr[1]
else:
first_max = arr[1]
second_max = arr[0]
for i in range(2, n):
if arr[i] > first_max:
second_max = first_max
first_max = arr[i]
elif arr[i] > second_max and arr[i] != first_max:
second_max = arr[i]
print(second_max)
请有人解释其背后的逻辑。
答案 0 :(得分:1)
问题在于您在此处编写的第一个和第二个max的初始化
if arr[0] >= arr[1]:
first_max = arr[0]
second_max = arr[1]
else:
first_max = arr[1]
second_max = arr[0]
在[6,6,6,6,6,6,6,6,6,5]
的情况下,您的first_max和second_max都等于6,并且在给定5时不能更改,因为第二个最大值仍大于5。
一种解决方案是编辑部分代码
之前
elif arr[i] > second_max and arr[i] != first_max:
second_max = arr[i]
之后
elif first_max == second_max or (arr[i] > second_max and arr[i] != first_max:
second_max = arr[i])
答案 1 :(得分:1)
def second_biggest(l):
""" Get second biggest entry in a list
1. make a `set` out of `list`: guarantees that every entry only appears once
2. sort the `set` by value
3. get the second biggest entry
"""
return sorted(set(l))[-2]
答案 2 :(得分:1)
您的问题从前2个元素为6开始。因此,第一个和第二个最大值均为6,因此忽略了5。
最佳做法是抛出所有重复值-您可以使用python内置函数来这样做(set
)。然后尝试运行您的代码。
第二种方法是将第一个最大值设为第一个元素,将第二个最大值设为-1
,因此,第一次遇到较大的元素时,将设置其中一个最大值。如果循环结束并且第二个最大值仍为-1
,则表示所有元素都相同
答案 3 :(得分:1)
这是另一种方法:将数据转换为一个集合(因此删除重复的元素),删除最大值,然后打印then-maximum。例如:
data = [6,6,6,6,6,6,6,6,6,5]
sb = set(data) # remove duplicate elements
sb.remove(max(sb)) # remove the max element
print(max(sb)) # print the new max
输出:
5
如果您只想删除重复的元素,请将集合转换回列表:
data = [6,6,6,6,6,6,6,6,6,5]
data = list(set(data))
输出:
>>> data
[5, 6]
答案 4 :(得分:0)
您可以尝试使用sorted
方法进行排序,然后通过转换为set来查找第二大元素,以删除重复的元素,然后选择倒数第二个元素。
arr = [2, 4, 5, 5, 455, 34]
unique_arr = sorted(set(arr))
print(unique_arr[-2])
修改:
不使用python set
或sorted
函数:
arr = [1, 4, 5, 723, 64, 76, 34]
max_1 = max(arr)
max_2 = min(arr)
for item in arr:
if item > max_2 and item != max_1:
max_2 = item
print("Second largest item: ", max_2)