哈喽大家好,我是了不起,今天我们聊一聊那些让我们猝不及防的Python面试题
前言
相信在Python这个领域的,都经历过了很多的面试,如果像是一些往常的一些基础面试就倒还好,但是,如果面试官一下给我们异常场景,让我们口述代码逻辑或者当场手写Python代码,小编之前可是遇到了很多次了,这是非常难受的,对于那些大佬我们就不说了,肯定是手拿把掐的。但是对于代码能力不强的同学来说,这可是要了老命了,跟我刚开始加入工作一样,离开了电脑啥也不会了~~~~
所以今天就来一起看看那些经常出现的Python面试题。
一.冒泡排序
我相信这个是很多初中级在面试的时候都会遇到的,不管是升序的排序还是降序的排序 冒泡排序-升序:
def bubble_sort(nums):
n = len(nums)
for i in range(n):
for j in range(0, n-i-1):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
nums = [5, 3, 2, 1, 4]
print(bubble_sort(nums))
# [1, 2, 3, 4, 5]复制
该算法的步骤如下:
比较相邻的元素。如果第一个比第二个大,就交换 them 。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 重复步骤1~3,直到排序完成。
该算法的优点是简单直观,空间复杂度小。缺点是时间效率较低, not stable。
实现思路:
设置一个标志索引n,它表示每轮 sorting 需要比较的次数,此值在每轮循环开始前递减1。 外层for循环用于进行n轮排序。 内层for循环用于进行每轮排序中元素的两两比较和交换。 如果相邻两个元素的大小顺序错误,则交换 them。 循环执行,直到排序结束。 返回排序后的列表。
冒泡排序-降序:
def bubble_sort_desc(nums):
n = len(nums)
for i in range(n):
for j in range(0, n-i-1):
if nums[j] < nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
return nums
nums = [5, 3, 2, 1, 4]
print(bubble_sort_desc(nums))
# [5, 4, 3, 2, 1]复制
与升序冒泡排序的差别仅在于比较条件和交换顺序的修改:
如果nums[j] < nums[j+1], 表示第一个数小于第二个数,需要交换顺序。 交换顺序修改为nums[j], nums[j+1] = nums[j+1], nums[j],将较大的数交换到前面。其他实现思路和时间空间复杂度与升序冒泡排序相同。
二.用Python求最大公约数
最大公约数,我相信很多人离开学校后都忘了是啥吧,这里先给大家科普一下什么是最大公约数 定义:最大公约数(Greatest Common Divisor,缩写为GCD)指两个或多个整数的公共约数中最大的一个数。比如:
12 和 18 的公约数有:1, 2, 3, 6 其中最大的一个数是6 所以,12 和 18 的最大公约数是6
公约数指能够同时整除两个或多个整数的数。
至于实现求最大公约数的方式有很多种
1.欧几里算法
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
# [5, 4, 3, 2, 1]复制
该算法的思想是:如果能整除则除,否则被除数变除数,除数变余数,直到余数为0。
2.辗转相除法
def gcd(a, b):
if a < b:
a, b = b, a # 保证a>=b
if b == 0:
return a
return gcd(b, a % b)复制
该算法的思想是:通过递归将问题规模减小, 直到其中一个数为0,此时另一个数即为最大公约数。
3.python自带math模块中的gcd()方法:
import math
math.gcd(a, b)复制
简单直接调用即可求得最大公约数。以后面试官再问直接一句话回答完毕,逼值不一下就上去了~~
三、将字符串中的数字从小到大排序
这道题表面上看着还是挺简单的,玩过leetcode应该是见过这一道题的,解起来还是稍稍比较麻烦的
def sort_string(s):
nums = []
for num in s:
if num.isdigit():
nums.append(int(num))
nums.sort()
result = ''
index = 0
for char in s:
if char.isdigit():
result += str(nums[index])
index += 1
else:
result += char
return result
print(sort_string('dcba312'))
# dcba123复制
实现思路:
定义一个空列表nums用于存储提取的数字。 遍历字符串s的每个字符。 如果字符为数字,将其转为int类型添加到nums列表中。 对nums列表排序。 初始化结果字符串result和索引index。 再次遍历s的每个字符。 如果字符为数字,将nums列表中下标为index的数字转为str添加到result中,并index加1。 否则直接将字符添加到result中。 返回结果result。
四、列表去重
这道题就较为简单,可以直接使用列表推导式完成,以下的实现代码
# 用列表推导式遍历两个列表
result = [elem for elem in list1 + list2 if elem not in result]复制
当然,比起这个还有更加简单高效的方式得实现方式,直接使用集合(set)即可完成
# 先将两个列表转换为集合
set1 = set(list1)
set2 = set(list2)
# 取集合的并集,结果没有重复元素
union_set = set1 | set2
# 再将结果集合转换回列表
result = list(union_set)复制
代码分析:
首先需要将两个列表转换为集合,便于去重 然后对两个集合取并集,再将结果集合转换回列表。此过程实现了去重。 列表推导式会遍历两个列表的元素,每次都检查当前元素是否已经在结果列表中,未出现的才加到结果列表中。
总结:
使用集合(Set)去重相对简单高效 列表推导式实现去重也便捷灵活
如果列表中的元素是字典或对象,可以对对象的某个键(key)去重:
set1 = {obj['name'] for obj in list1}
set2 = {obj['name'] for obj in list2}
union_set = set1 | set2
result = [{"name": name} for name in union_set]复制
五、将字符串中的英文去重并将按照顺序输出
跟上面的将字符串中的数字从小到大排序这道题比较相似,在构造代码的时候需要多考虑重复的英文和数字问题,实现这个额需求可以分为以下步骤
将字符串中的英文和数字分开
letters = []
numbers = []
for char in str:
if char.isalpha():
letters.append(char)
elif char.isdigit():
numbers.append(char)复制
去重英文字母并排序
letters = list(set(letters))
letters.sort()复制
将数字转换为int列表并进行排序
numbers = [int(num) for num in numbers]
numbers.sort()复制
将去重、排序的结果拼接起来
result = ''.join(letters) + ''.join(str(number) for number in numbers)
复制
思路总结:
使用isalpha()判断是英文,isdigit()判断是数字 使用set()去重英文列表 使用list()将数字字符串转换为int列表 对英文列表和数字列表分别排序 得到结果后用join()拼接字符串
以上是列举了几个平时比较常见的一些Python实例面试题,觉得不错的可以给小编一键三连哦,如果还想看其他的面试题记得留言评论,如果留言评论量多的话小编可以继续再出案例分析的
PS:Python都知道技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入。
老规矩,道友们还记得么,右下角的 “在看” 点一下,如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!