Python 面試題:輸入一個數組,輸出該數組的第二大的數字


問題:
輸入一個數組,輸出該數組的第二大的數字,並且編寫相關的測試用例

注意:

1.如果list含有非int, float元素需要remove
2.如果list有重復的最大元素,需要自己處理,內置的list.sort(reverse=True)heapq.nlargest排序,元素個數不變。

附上代碼

removeInvalidItems 去掉不是int或float類型的值。
注意:不能像下邊這樣用一次循環,因為remove某個元素,下標發生了改變,有些值並不能移除

for item in l:  # remove non_value items
    if not isinstance(item, (int, float)):
        l.remove(item)

下邊是可用代碼,文件名為 findSecondUtil.py

def removeInvalidItems(l):
    tmpl = list()
    for item in l:
        if not isinstance(item, (int, float)):
            tmpl.append(item)
    for item in tmpl:
        l.remove(item)
    return l

findSecondItem.py 實現找到第二大數字的第一種方法。這種方法不用去掉重復元素。

import sys
from hyang.python3.interview.boyan.findSecondUtil import removeInvalidItems
#from findSecondUtil import removeInvalidItems
 
def findSecond(l):
    l = removeInvalidItems(l)
    length = len(l)
    if length == 0:
        print("there is no number item in the list")
        return None
    elif length == 1:
        print("there is only one number item, it's ", l[0])
        return None
    elif length > sys.maxsize:
        print("out of scope")
        return None
    largest, second = max(l), min(l)
    if largest == second:
        return None
    for item in l:
        if item > second and item < largest:
            second = item
    return second

findSecondTest.py 測試代碼

import unittest
from hyang.python3.interview.boyan.findSecondItem import findSecond
#from findSecondItem import findSecond
 
 
class Test_findSecondItem(unittest.TestCase):
 
    # 如果跑所有用例,只運行一次前提條件和結束條件。則用setupclass()和teardownclass()
    @classmethod
    def setUpClass(cls):
        print("在所有的測試用例執行之前,只執行一次============")
 
    @classmethod
    def tearDownClass(cls):
        print("在所有的測試用例執行之后,只執行一次============")
 
    # empty list
    def test_findSecondItem_01(self):
        l1 = list()
        assert (findSecond(l1) == None)
 
    # one item in list
    def test_findSecondItem_02(self):
        l1 = [2]
        assert (findSecond(l1) == None)
 
    # No item in list after remove non-number items
    def test_findSecondItem_03(self):
        l1 = [None, "abc", "xyz"]
        assert (findSecond(l1) == None)
 
    # one item in list after remove non-number items
    def test_findSecondItem_04(self):
        l1 = [None, 3, "abc"]
        assert (findSecond(l1) == None)
 
    # duplated largest number
    def test_findSecondItem_05(self):
        l1 = [32, None, 12, "abc", 8, 6, 36, 3, 32, 4, 36, 9, 25, '35', 36]
        assert (findSecond(l1) == 32)
 
 
# python3中寫不寫都會執行的
if __name__ == '__main__':
    unittest.main()

方法二:findSecondNum.py 從列表去掉所有的最大元素,再在列表中找一個最大就是第二大元素。

import sys
from hyang.python3.interview.boyan.findSecondUtil import removeInvalidItems
 
def findSecond(l):
    l = removeInvalidItems(l)
    length = len(l)
    if length == 0:
        print("there is no number item in the list")
        return None
    elif length == 1:
        print("there is only one number item, it's ", l[0])
        return None
    elif length > sys.maxsize:
        print("out of scope")
        return None
    largest=max(l)
    largest_count=l.count(largest)
    while largest_count>0:  #remove all the largest item
        l.remove(largest)
        largest_count-=1
    if len(l)==0:
        return None
    else:
        return max(l)

  

方法三:利用內置的list.sort,但是要去掉重復元素

import sys
from hyang.python3.interview.boyan.findSecondUtil import removeInvalidItems
 
def findSecond(l):
    removeInvalidItems(l)
    l2 = list(set(l))   # remove duplicated items
    l2.sort(reverse=True)
    length=len(l2)
    if length>=2:
        return l2[1]
    else:
        return None

方法四:與方法三類似,利用內置的heapq.nlargest,也需要去掉重復元素

import sys, heapq
from hyang.python3.interview.boyan.findSecondUtil import removeInvalidItems
 
def findSecond(l):
    removeInvalidItems(l)
    l2 = list(set(l))   # remove duplicated items
    length = len(l)
    length = len(l2)
    if length >= 2:
        return heapq.nlargest(2, l2)[1]
    else:
        return None

最后需要注意執行程序所在路徑,見下圖,可以結合自己的配置來調整。
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM