2

したがって、リストから 2 番目に大きい数を見つける必要があります。私は単純なループでそれをやっています。

私のアプローチは、リストを 2 つの部分に分割し、最大の数を 2 つの部分に分けて見つけ、2 つの数を比較することです。2つのうち小さい方を選びます。既製の関数や別のアプローチを使用できません。

基本的に、これは私のコードです。しかし、それは正しく実行されません

#!/usr/local/bin/python2.7

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest=alist[0]
h=len(alist)/2 
m=len(alist)-h

print(alist)

for i in alist:
    if alist[h]>largest:
      largest=alist[h]
      i=i+1
print(largest)
4

14 に答える 14

11

O(n^2) アルゴリズム:

In [79]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [80]: max(n for n in alist if n!=max(alist))
Out[80]: 100

O(n) アルゴリズム:

In [81]: alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

In [82]: M = max(alist)

In [83]: max(n for n in alist if n!=M)
Out[83]: 100
于 2013-10-31T02:40:26.953 に答える
4

入力を並べ替える必要はなく、このソリューションは O(n) で実行されます。あなたの質問は組み込み関数を使用できないと言っているので、これを使用できます

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest, larger = alist[0], alist[0]

for num in alist:
    if num > largest:
        largest, larger = num, largest
    elif num > larger:
        larger = num
print larger

出力

100

最大数と ​​2 番目に大きい数を追跡します (larger変数はそれをコードに格納します)。現在の番号が より大きい場合、現在の番号はにlargestなり、ちょうどlargestになります。largestlarger

largest, larger = num, largestのショートカットです

temp = largest
largest = num
larger = temp

編集:コメントでのOPのリクエストに従って、

def findLarge(myList):
    largest, larger = myList[0], myList[0]
    for num in myList:
        if num > largest:
            largest, larger = num, largest
        elif num > larger:
            larger = num
    return largest, larger

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]

firstLargest, firstLarger  = findLarge(alist[:len(alist)//2])
secondLargest, secondLarger = findLarge(alist[len(alist)//2:])

print sorted((firstLarger, firstLargest, secondLarger, secondLargest))[-2]
于 2013-10-31T03:06:01.413 に答える
4

リストを分割するアプローチが必要な場合、私が考えることができる最も近いものはMergeSortです。リストを2つに分割して機能しますが、リストをソートします。次に、最後の 2 つの要素を取得できます。

alist = [1, 7, 3, 2, 8, 5, 6, 4]

def find_2_largest(alist):
    sorted_list = mergesort(alist)
    return (sorted_list[-2], sorted_list[-1])    

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def mergesort(alist):
    if len(alist) < 2:
        return alist
    middle = len(alist) / 2
    left = mergesort(alist[:middle])
    right = mergesort(alist[middle:])
    return merge(left, right)

print find_2_largest(alist)
于 2013-10-31T03:09:38.580 に答える
2

これを試して:

alist=[10, 0,3,10,90,5,-2,4,18,45,707, 100,1,-266,706, 1]
largest = alist[0]
second_largest = alist[0]
for i in range(len(alist)):
    if alist[i] > second_largest:
        second_largest = alist[i]
    if alist[i] > largest:
        tmp = second_largest
        second_largest = largest
        largest = tmp      

print(largest, second_largest)
于 2013-10-31T02:50:19.320 に答える
2

O(n) ソリューション

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
m = alist[:2] #m will hold 2 values, fill it with the first two values of alist
for num in alist:
    m = sorted(m + [num],reverse=True)[:2] #appends num to m and sorts it, takes only top 2
m[1] #the second highest element.

編集:負の数で動作するように変更されました。基本的な説明は次のとおりです

まず、alist の最初の 2 つの要素を m に設定します。alist を反復処理するとき、m の末尾に 1 つの値を追加し、3 つの要素を並べ替えて最小のものを破棄します。これにより、最後に m に上位 2 つの最大要素が含まれることが保証されます。

于 2013-10-31T02:46:39.213 に答える
1

リストで2 番目に大きい数:

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
second_highest_number = sorted(list(set(alist)))[-2]

リストで 2 番目に大きい要素のみが必要な場合(最大値が2 回発生する可能性がある場合)、set() と list() の呼び出しをスキップします。

alist=[-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
second_highest_number = sorted(alist)[-2]
于 2015-06-08T20:40:38.663 に答える
1

コードを公開することなく、この問題を解決するための私のアプローチを紹介します。

1.) リストを取り、最小のものから最大のものへと並べ替えます。これを処理するPython関数があります

2.) リストを 2 つのセクションに分割する

3.) 2 つのセクションを比較し、最大数の半分を取り、#2 を繰り返します。

4.) どちらかの半分に数字が 2 つしか含まれていない場合は、そのリストから最初の数字を取ります

課題は、リストを均等に分割できない場合にどうするかを決定する必要があることです。明らかに、現実の世界では、リストをソートして最後の値から 2 番目の値を返しますが、バイナリ分割を実行してそれを行う必要がある場合は、これが私が行う方法です :)

于 2013-10-31T02:41:27.530 に答える
0
biggest = None
second_biggest = None

biggest = num_list[0]
if num_list[1] > biggest:
   second_biggest = num_list[1]
else:
   second_biggest = biggest
   biggest = num_list [1]

for n in num_list [2:]:
    if n >= biggest:
        biggest, second_biggest = n, biggest
    elif n >= second_biggest:
        second_biggest = n

print second_biggest
于 2013-10-31T03:25:03.130 に答える
0
 list1=[1,10,2,3,5,7,1,-32,90,99,99]
 max=0
 secmax=0
 for i in list1:
    if i>max:
       max=i
 for i in list1:
    if i>secmax and max!=i:
      secmax=i
 print(secmax)
于 2019-12-04T10:45:54.427 に答える
0
alist = [-45,0,3,10,90,5,-2,4,18,45,100,1,-266,706]
largest = 0
second_largest = 0
for large in alist:
  if second_largest < large:
    second_largest = large

  if largest < large:
    temp = second_largest
    second_largest = largest
    largest = temp

print "First Highest:- %s" %largest
print "Second Highest:- %s" %second_largest
于 2016-07-28T08:13:45.977 に答える