Python 面试题:输入一个数组,输出该数组的第二大的数字

枫铃3年前 (2021-09-30)Python215

问题:
输入一个数组,输出该数组的第二大的数字,并且编写相关的测试用例

注意:

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 实现找到第二大数字的第一种方法。这种方法不用去掉重复元素。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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>, 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)
 
    #>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)
 
    #>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 从列表去掉所有的最大元素,再在列表中找一个最大就是第二大元素。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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>, 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,也需要去掉重复元素

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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

最后需要注意执行程序所在路径,见下图,可以结合自己的配置来调整。
在这里插入图片描述

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。