百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

面试Python开发的这道题超简单,我却搞砸了

off999 2024-10-12 06:12 39 浏览 0 评论

题图 | Shutterstock / studiostoks

这道算法题明明超简单……

上午10点,在T公司的会议室里,小R正在参加一场他准备了好几天的技术面试。

整体来说,他在这场面试中的表现还不错。无论坐在小R对面的面试官提出什么问题,他都能侃侃而谈、对答如流。从单体应用聊到微服务,从虚拟机聊到云计算,每一块小R都说得滴水不漏。就在他慢慢认为自己胜券在握,可以通过这家自己憧憬已久的公司面试时,对面的面试官突然说道:“技术问题我问得差不多了。最后有一道编程题,希望你可以做一下。”

说完,面试官低头从包里拿出了一台笔记本电脑,递给了小R。小R有些紧张地接过电脑,发现屏幕上是一道算法题。

题目 冒泡排序算法

请用Python语言实现冒泡排序算法,把较大的数字放在后面。注意:默认所有的偶数都比奇数大。


>>> numbers = [23, 32, 1, 3, 4, 19, 20, 2, 4]
>>> magic_bubble_sort(numbers)
[1, 3, 19, 23, 2, 4, 4, 20, 32]


“冒泡排序,这不是所有排序算法里最简单的一种吗?虽然加了一点儿变化,但看起来没有什么难度啊。”小 R 一边在心里这么想着,一边打开编辑器开始写代码。

五分钟后,他把笔记本递给面试官,说道:“写完了!”

代码清单1-1就是他写的代码。

代码清单1-1 小R写的冒泡排序函数

def magic_bubble_sort(numbers):
j = len(numbers) - 1
while j > 0:
for i in range(j):
if numbers[i] % 2 == 0 and numbers[i + 1] % 2 == 1:
numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]
continue
elif (numbers[i + 1] % 2 == numbers[i] % 2) and numbers[i] > numbers[i + 1]:
numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]
continue
j -= 1
return numbers

这段代码没有任何多余的逻辑,可以通过所有的测试用例。面试官看着小R演示完函数功能后,盯着代码似乎想说点儿什么,但最后只是微微点了点头,说:“好,今天的面试就到这儿吧。有后续面试我再通知你。”

小R高高兴兴地回到家,一心觉得这次面试稳了,可没想到,他后来却再也没接到任何后续面试通知。


1

问题出在哪里?

究竟是哪里出了问题呢?小R思来想去,觉得自己答问题时表现挺好,最有可能出问题的是最后一道编程题,肯定漏掉了什么边界情况没处理。

于是他找到一位有着十年编程经验的前辈小Q,凭着记忆把题目和自己的答案还原给对方看。

“题目大概就是这样,这是我当时写的代码。Q哥,你帮忙看看,我是不是有什么情况没考虑到?”小R问道。

小Q盯着他写的代码,足足两分钟没说一句话。然后突然开口道:“小R啊,你这个函数功能实现得没毛病,就是实在太难看懂了。"

“总共就10行代码。难看懂?怎么会呢?”小R在心里犯起了嘀咕。这时,前辈小Q说道:“这样,你把笔记本给我,我来给你稍微改改这段代码,然后你再看看。”

于是,三分钟后,小Q把把修改过的代码递了过来,如代码清单1-2所示。

代码清单1-2 小Q修改后的冒泡排序函数

def magic_bubble_sort(numbers: List[int]):
"""有魔力的冒泡排序算法,默认所有的偶数都比奇数大

:param numbers: 需要排序的列表,函数将会直接修改原始列表
"""

stop_position = len(numbers) - 1
while stop_position > 0:
for i in range(stop_position):
current, next_ = numbers[i], numbers[i + 1]
current_is_even, next_is_even = current % 2 == 0, next_ % 2 == 0
should_swap = False

# 交换位置的两个条件:
# - 前面是偶数,后面是奇数
# - 前面和后面同为奇数或者偶数,但是前面比后面大
if current_is_even and not next_is_even:
should_swap = True
elif current_is_even == next_is_even and current > next_:
should_swap = True

if should_swap:
numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]
stop_position -= 1
return numbers

①注意:此处变量名是next_而非next,这是因为已经有一个内置函数用了next这个名字。PEP8规定在这种情况下,应该给变量名增加 _ 后缀来避免冲突

小R盯着这段代码,发现它的核心逻辑和之前没有任何不同。但不知为何,这段代码看上去就是比自己写的代码更舒服。小R若有所思,好像一下明白了没通过面试的原因。

故事讲完了。看上去,前辈小Q只是在小R的代码之上做了些“无关痛痒”的改动,但正是这些“无关痛痒”的改动,改善了代码的观感,提升了整个函数的可读性。


2

“无关痛痒”的改动

和小R写的代码相比,前辈小Q的新代码主要进行了以下改进:

  1. 变量名变成了可读的、有意义的名字,比如在旧代码里,“停止位”是无意义的j,新代码里变成了stop_position。
  2. 增加了有意义的临时变量,比如current/next_ 代表前一个/后一个元素、{}_is_even代表元素是否为偶数、should_swap代表是否应该交换元素。
  3. 多了一点儿恰到好处的指引性注释,比如说明交换元素顺序的详细条件。

这些变化让整段代码变得更易读,也让整个算法变得更好理解。所以,哪怕是一段不到10行代码的简单函数,对变量和注释的不同处理方式,也会让代码发生质的变化。


本文摘自《Python工匠:案例、技巧与工程实践》

简介:本书基于广受好评的“Python工匠”系列开源文章。全书从工程实践角度出发,通过剖析核心知识、展示典型案例与总结实用技巧,帮助大家系统进阶Python,写好工程代码,做好实践项目。

相关推荐

win10系统安装不了(win10 安装不了)

电脑装不上win10系统可能是因为以下几个原因导致的原因一:win10安装文件不对我们在安装win10之前,要确保下载到安装包真实可用的,否则安装肯定会有问题,建议下载安全可靠的安装包!原因二:系统文...

国内dns哪个最快(dns开启好还是关闭好)

移动dns设置首选114.114.114.114,它又好又快。首选DNS和备用DNS都是一种域名系统,这两种域名系统有着先后之分,如果在首选DNS正常的情况下,就用首选DNS地址。当首选DNS服务器出...

winxp安装盘(winxp系统安装)

xp系统安装步骤如下1、将下载的xp系统iso压缩包文件下载到C盘之外的分区,比如下载到D盘,右键使用WinRAR等工具解压到当前文件夹或指定文件夹,不能解压到C盘和桌面,否则无法安装;?2、解压之后...

现在的win11稳定了吗(win11稳定嘛)

windows10更稳定,由于win11刚刚推出没多久,稳定差不够好,兼容性也有待提升,无论是应用还是游戏都会遇到不明程度的问题,因此,在日常的使用过程中,我们还是应当以稳定性为优先,选择win10是...

xp安装包下载到手机(xp系统安装包)

手机是基于ARM架构的处理器,而WindowsXP是基于x86架构的操作系统,因此无法直接在手机上安装WindowsXP。除非您的手机是使用Intel处理器,但这种情况非常罕见。如果您需要在手机上...

如何查看硬盘序列号(windows如何查看硬盘序列号)

1.打开开始菜单栏,输入【cmd】点击【确定】;2.在命令窗口依次输入【diskpart】-【listdisk】-【selectdisk0】;3.选好要查看的硬盘后,接着输入【detaildi...

虚拟机安装win7教程(虚拟机安装win7教程图解)

1.首先,下载并安装虚拟机软件,如VMwareWorkstation、VirtualBox等。2.打开虚拟机软件,创建一个新的虚拟机。3.在创建虚拟机的过程中,选择安装Windows7专业版的IS...

系统脱敏法的操作程序如何

系统脱敏疗法(systematicdesensitization)又称交互抑制法,是由美国学者沃尔普创立和发展的。这种方法主要是诱导求治者缓慢地暴露出导致神经症焦虑、恐惧的情境,并通过心理的放松状态...

闪迪u盘低级格式化工具(闪迪u盘格式化分配单元大小)

闪迪U盘格式化后速度变慢的可能原因及解决方法如下:文件系统问题:格式化时选择的文件系统类型可能会影响U盘的性能。常见的文件系统类型包括FAT32、NTFS和exFAT等。如果文件系统类型不合适,可能会...

psd文件下载(psd格式下载网站)

  1、在photoshop中,不能通过置入的方法来加载PSD文件,因为,通过置入的方法加载PSD文件,它是以合并图层的方法把PSD文件加入,这样,就失去了PSD文件的所有图层信息。  2、在文档中想...

宏碁官网下载win7系统(宏碁官方系统)

宏基笔记本win8系统换成win7步骤:1、更改bios设置,关闭“SecureBoot”功能,启用传统的“LegacyBoot”。2、制作u启动U盘启动盘,下载win7系统安装包3、设置U盘启动...

如何重装系统win7旗舰版32位

首先下载制作一个带系统的启动u盘,然后按以下步骤安装:1、首先关闭电脑上面的杀毒软件,2、进入bios选择u盘启动。3、插入启动u盘重新启动电脑4、进入pe系统镜像环节,选择要安装的系统(32位),然...

应用程序发生异常0xe0000008

先查看一下对应的软件是不是出现了损坏,也可以重装此软件。我们还可以尝试通过修改注册表来解决。按Win+R(或者在开始菜单搜索框输入“运行”)打开运行,然后输入“regedit”回车,打开注册表恢复原来...

笔记本连接wifi显示无法连接网络

笔记本电脑连接wifi时提示无法连接到这个网络1、打开电脑“控制面板”,点击“网络连接”,选择本地连接,右键点击本地连接图标后选“属性”,在“常规”选项卡中双击“Internet协议(TCP/IP)...

windowsc盘清理大师(c盘清理大师怎么样)

 C盘清理大师是一款流氓软件,可不是windows10里自带。在你的电脑上出现这个软件一般情况下可以证明你使用的系统是盗版的,系统采用的是网上流传的系统镜像制作的。在网上流传这些系统镜像文件...

取消回复欢迎 发表评论: