暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

这些常见的Python面试题你都见过吗?

Python都知道 2023-07-10
128

哈喽大家好,我是了不起,今天我们聊一聊那些让我们猝不及防的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 = [53214]
print(bubble_sort(nums))
# [1, 2, 3, 4, 5]

复制

该算法的步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换 them 。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 重复步骤1~3,直到排序完成。

该算法的优点是简单直观,空间复杂度小。缺点是时间效率较低, not stable。

实现思路:

  1. 设置一个标志索引n,它表示每轮 sorting 需要比较的次数,此值在每轮循环开始前递减1。
  2. 外层for循环用于进行n轮排序。
  3. 内层for循环用于进行每轮排序中元素的两两比较和交换。
  4. 如果相邻两个元素的大小顺序错误,则交换 them。
  5. 循环执行,直到排序结束。
  6. 返回排序后的列表。

冒泡排序-降序:

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 = [53214]
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

复制

实现思路:

  1. 定义一个空列表nums用于存储提取的数字。
  2. 遍历字符串s的每个字符。
  3. 如果字符为数字,将其转为int类型添加到nums列表中。
  4. 对nums列表排序。
  5. 初始化结果字符串result和索引index。
  6. 再次遍历s的每个字符。
  7. 如果字符为数字,将nums列表中下标为index的数字转为str添加到result中,并index加1。
  8. 否则直接将字符添加到result中。
  9. 返回结果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]

复制

五、将字符串中的英文去重并将按照顺序输出

跟上面的将字符串中的数字从小到大排序这道题比较相似,在构造代码的时候需要多考虑重复的英文和数字问题,实现这个额需求可以分为以下步骤

  1. 将字符串中的英文和数字分开
letters = []
numbers = []

for char in str:
    if char.isalpha():
        letters.append(char)
    elif char.isdigit(): 
        numbers.append(char)

复制
  1. 去重英文字母并排序
letters = list(set(letters))
letters.sort()

复制
  1. 将数字转换为int列表并进行排序
numbers = [int(num) for num in numbers]  
numbers.sort()

复制
  1. 将去重、排序的结果拼接起来
result = ''.join(letters) + ''.join(str(number) for number in numbers)

复制

思路总结:

  • 使用isalpha()判断是英文,isdigit()判断是数字
  • 使用set()去重英文列表
  • 使用list()将数字字符串转换为int列表
  • 对英文列表和数字列表分别排序
  • 得到结果后用join()拼接字符串

以上是列举了几个平时比较常见的一些Python实例面试题,觉得不错的可以给小编一键三连哦,如果还想看其他的面试题记得留言评论,如果留言评论量多的话小编可以继续再出案例分析的


PSPython都知道技术交流群(技术交流、摸鱼、白嫖课程为主)又不定时开放了,感兴趣的朋友,可以在下方公号内回复:666,即可进入。


老规矩,道友们还记得么,右下角的 “在看” 点一下如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!





文章转载自Python都知道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论