编程学习网 > 编程语言 > Python > Python写一个函数找出一个整数数组中,第二大的数
2025
08-07

Python写一个函数找出一个整数数组中,第二大的数


这个找“第二大”的面试题,说简单吧确实不难,说难呢也确实容易掉坑。别看就一句话,背后藏着不少细节。今天咱就用这个小题目,聊聊我对“算法题”的一些看法,还有这题怎么写,怎么踩坑,怎么写得体面。

我得先吐槽一句,这种“找第二大”的题属于那种HR最喜欢放在面试第一轮、技术初筛用来筛态度的题。你写得太烂,HR就觉得你基础不牢;你写得太花哨,又可能被认为是“刷题怪”。所以,这种题真正要做的,其实是“写得刚刚好”——代码写得不啰嗦,思路说得清清楚楚,还得体现你对边界条件、性能的理解。换句话说,这题考的不是你有没有技术,而是你有没有经验。

好了,说正事,先不急着上代码,咱们先捋清楚逻辑。

这个“第二大”,咱不能傻乎乎地先排序一遍然后取倒数第二个。为啥?排序是O(n log n),而找一个数,其实你O(n)就能搞定,这多了个log n,性能上就不够优雅了。更关键的是,万一有重复值呢?数组里最大值是10,有三个10,那第二大不是10,是紧接着10往下的那个数,比如8。所以你不能偷懒排序,要老老实实从头扫一遍。

那咱怎么办?我一般喜欢用两个变量,一个记录最大值first_max,一个记录第二大second_max。初始化成负无穷,或者更稳妥点,干脆设成None,后面再判断。

扫数组时,逻辑也很简单:

  1. 如果当前数比first_max还大,那说明它是新的最大值,second_max要被更新成之前的first_max
  2. 如果当前数不是最大,但比second_max大,又不等于first_max,那说明它有可能是第二大;
  3. 其他情况,直接跳过。

代码大致长这样:

逻辑就这么几行,但是你能写出这么“收敛”的代码,面试官一看就知道你不是来套模板的,是认真考虑过每种可能的。特别是数组里有重复元素、负数、全相等的时候,都能处理得游刃有余。

讲真,很多同学在做这题时会直接用:

你说它错吗?不错啊。Python牛就牛在可以一行搞定。但是你拿这种写法去面试,我只能说:如果对方是Python面试官,可能觉得你机灵;如果是C++背景的面试官,保不齐就觉得你“投机取巧”。为啥?因为你没体现对算法复杂度的控制,这里set()去重、sorted()排序,其实综合下来是O(n log n),在数据量大的时候不划算。

你如果真想用Python优势,也可以稍微“修饰”一下,比如:

这样一来你就能解释说:“我知道你要的是第二大不等于最大值的那个,所以我先去重。”这就比上面那一行强不少。

还有个细节是,题目没说数组有没有空、是不是全是相等值、有没有负数,甚至有没有非整数。你要是真遇到那种一股脑儿全是10的数组 [10, 10, 10],那这个题的“第二大”其实是没有的——这个你代码得能返回None或者提示“没有第二大”。面试时你要是能顺嘴提一下这些边界,妥妥加分。

说到这我得多说一句,很多时候公司招人不是在看你能不能刷出正确答案,而是在看你有没有“审题意识”和“工程思维”。就像我之前在一个创业公司面试一个候选人,他把这题写得贼漂亮,用了个heapq配合set,写得很极客范儿,但问题是他没处理数组长度不足、值重复等场景。后面问他为啥不考虑这些,他还说:“你题目没说要考虑这些。”我当场就给他打了个问号。

讲真,在公司里写代码,没有人给你列清楚所有边界条件,全靠你自己经验和敏感度。一个靠谱的工程师,写函数的时候脑子里必须自带“防御编程”意识。

这题还有个“延伸”,就是问你能不能用一遍遍历实现?上面的逻辑就符合这个要求,O(n)复杂度,只遍历一次。要是你能主动提这点,说明你对算法复杂度是有掌控的,不是“背题”的刷题党。

而且别小看这个“第二大”的题,它其实是很多复杂题的雏形。你只要稍微变种一下,比如:

  • 找第二小;
  • 找倒数第二大;
  • 找数组里第k大的值;
  • 找一个数前面比它小、后面比它大的组合;
  • 找最大两个数的和;

这些题套路都差不多,但如果你没搞清楚“比较逻辑+边界处理+去重判断”这几个点,分分钟写错。

之前我带实习生的时候,还真有个哥们把“第二大”这题写成这样:

你看着挺合理的哈?但是你一旦nums有多个最大值,这就挂了。比如 [10, 10, 8],它只删掉一个10,再max,还是10。坑就在这。

这时候你要是面试官,你是不是觉得这个人没意识到数据重复是个常见问题?所以我一直说,这种题不光考你写不写得出来,更考你“想没想到那些坑”。

最后,我再给大家一个“进阶版本”的思路,如果你用C语言面试,那你得自己处理初始值、数组越界之类的问题,这题就没那么简单了。比如不能直接设成None,那你要考虑用INT_MIN、或者用布尔变量标记是否已经赋值。代码量瞬间翻倍,还特别容易出错。

所以写Python的时候,要感谢这个语言的宽容,也要别太“佛系”,该考虑的坑该补的判断,绝不能省。

好了,这题我就聊到这。表面上是一道找第二大的小题,实则是一面镜子,照出你写代码到底有没有“思考”。以后遇到这种题,不求你写得多快,但求你写得有“意识”。

你要真能把这种“看起来简单”的题写得滴水不漏,面试官心里会有数:“这人,靠谱。”

以上就是“Python写一个函数找出一个整数数组中,第二大的数的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取