【Python学习日记】面试篇① 盘点Python面试题中的八大经典题目

一、题目:FizzBuzz

FizzBuzz是一个简单的小游戏。游戏规则如下:从1开始数数,当你的数字为3的倍数时, 说出“Fizz”代替数字,5的倍数用“Buzz”代替,对于既是3又是5的倍数,就说“FizzBuzz”。现在,让我们写一个Python程序,打印出1到100的FizzBuzz。

问题要求:从1开始数到100。而不仅仅是个位数,应该可以对任意整数进行FizzBuzz化。

以下是完成该任务的Python代码:

# 定义一个执行FizzBuzz的函数,参数从1到100
def fizz_buzz(n):
    # 通过 for 循环逐一遍历
    for i in range(1, n+1):
        # 使用条件判断写出FizzBuzz的规则
        # 对15取余,如果为0,既可以被3整除,也能被5整除
        if i % 15 == 0:
            print('FizzBuzz')
        # 对3取余,如果为0,就可以被3整除
        elif i % 3 == 0:
            print('Fizz')
        # 对5取余,如果为0,就可以被5整除
        elif i % 5 == 0:
            print('Buzz')
        else:
            # 其他情况下,直接打印数字
            print(i)

# 调用函数,测试1到100的数字
fizz_buzz(100)

代码注释解释:

  1. 首先,我们定义了一个函数名为fizz_buzz,该函数接受一个参数n,代表我们要进行FizzBuzz化的数字的范围。
  2. 通过for循环,我们遍历了从1到n的所有整数。
  3. 在循环中,我们对每个数字做出判断。如果数字能够同时被3和5整除,那么这个数字就应该被FizzBuzz化。这通过判断是否能被15(3和5的公倍数)整除实现。如果满足条件,我们就打印出’FizzBuzz’。
  4. 如果数字不能同时被3和5整除,我们继续判断它是否能被3整除。如果满足条件,我们就打印出’Fizz’。
  5. 如果数字既不能被3整除,也不能同时被3和5整除,我们再判断它是否能被5整除。如果满足条件,我们就打印出’Buzz’。
  6. 如果上述所有条件都不满足,那么我们便直接打印出这个数字。
  7. 最后,我们调用了这个函数,测试了从1到100的数字,打印出其FizzBuzz形式。

这是一个非常经典的入门题目,同时也是许多面试官喜欢问的问题,主要是用来测试编程者是否能对问题进行基本的逻辑分析和编程逻辑的实现。

二、题目:合并两个有序列表

给定两个已排序的列表,将它们合并成一个新的有序列表。您可以将新的列表直接打印到控制台。

问题要求:尽量不要修改原始列表。

以下是完成该任务的Python代码:

def merge_sorted_lists(list1, list2):
    # 初始化结果列表和两个列表的索引
    result = []
    i = j = 0

    # 当两个列表中任意一个还有剩余元素时执行循环
    while i < len(list1) and j < len(list2):
        # 根据两个列表当前索引的元素大小来决定下一步如何操作
        if list1[i] < list2[j]:
            result.append(list1[i])
            i += 1
        else:
            result.append(list2[j])
            j += 1

    # 如果列表1还有剩余元素,将其全部添加到结果列表里
    while i < len(list1):
        result.append(list1[i])
        i += 1

    # 如果列表2还有剩余元素,将其全部添加到结果列表里
    while j < len(list2):
        result.append(list2[j])
        j += 1

    return result

# 示例输入
list1 = [1, 3, 5, 7]
list2 = [2, 4, 6, 8]

# 输出:[1, 2, 3, 4, 5, 6, 7, 8]
print(merge_sorted_lists(list1, list2))

代码注释解释:

  1. 首先,我们定义了一个名为merge_sorted_lists的函数,该函数接受两个已排序的列表list1list2作为输入。

  2. 在函数内部,我们创建一个名为result的空列表,它将存储合并后的有序列表。同时,我们定义了两个变量ij,分别表示list1list2的索引。

  3. 使用while循环,当i小于list1的长度且j小于list2的长度时,该循环将继续执行。在循环内部,我们通过比较list1[i]list2[j]的值来决定哪个元素应该添加到结果列表中。如果list1[i]的值较小,我们将其添加到结果列表中,并将i加1。否则,我们将list2[j]添加到结果列表中,并将j加1。

  4. 循环结束后,列表list1list2可能仍有剩余的元素。因此,我们使用两个额外的while循环来处理这种情况。第一个循环将list1中剩余的元素添加到结果列表中,同时更新i。第二个循环将list2中剩余的元素添加到结果列表中,同时更新j

  5. 最终,函数返回合并后的有序列表。

  6. 为了测试这个函数,我们给出了两个示例列表list1list2。当我们运行函数并打印其结果时,我们可以看到输出的有序列表为:[1, 2, 3, 4, 5, 6, 7, 8]

这个问题是一个很有趣的算法题,它评估了您对排序算法和列表操作的了解。在实际编程中,该问题基础实现的方法还有很多种,例如使用双指针,分治方法等。这个问题可以用于编程练习,算法竞赛和面试中。

三、题目:计算一个字符串里所有字符出现的次数

给定一个字符串,编写一个函数,计算并返回一个字典,其中字典的键是字符串中的字符,值是它们出现的次数。结果应该不区分大小写并忽略标点符号和空格。

问题要求:程序应该不区分大小写并忽略非字母字符。建议用字典实现。

以下是完成该任务的Python代码:

def count_char_frequency(s):
    # 初始化一个空字典来存储字符频率
    frequency = {}
    
    # 遍历输入字符串的每个字符
    for char in s:
        # 先转为小写
        char = char.lower()
        
        # 检查字符是否为字母,忽略非字母字符
        if char.isalpha():

            # 如果字符存在于字典中,将该字符出现的次数加1
            if char in frequency:
                frequency[char] += 1

            # 如果字符不在字典中,将其添加到字典并设置出现次数为1
            else:
                frequency[char] = 1

    return frequency

# 示例输入
input_str = "Hello, World! This is a test string."

# 输出:{'h': 2, 'e': 3, 'l': 4, 'o': 2, 'w': 1, 'r': 2, 'd': 1, 't': 4, 'i': 3, 's': 4, 'a': 1, 'g': 1, 'n': 2}
print(count_char_frequency(input_str))

代码注释解释:

  1. 首先,我们定义了一个名为count_char_frequency的函数,该函数接受一个字符串s作为输入。

  2. 在函数内部,我们创建一个名为frequency的空字典,它将存储字符串中字符出现的次数。

  3. 使用for循环,我们遍历字符串中的每个字符。在循环内部,我们将当前字符转换为小写,以便在结果中不区分大小写。

  4. 使用isalpha()方法,我们检查当前字符是否为字母。这使我们能够忽略输入字符串中的非字母字符,例如标点符号、数字和空格。

  5. 接下来,我们检查当前字符是否已经存在于frequency字典中。如果存在,我们将该字符出现次数加1。如果不存在,我们将字符添加到字典中,并将其出现次数设置为1。

  6. 当循环完成时,我们返回包含字符频率的frequency字典。

  7. 为了测试这个函数,我们提供了一个包含大写字母、小写字母、标点符号和空格的示例字符串input_str。当我们运行函数并打印其结果时,我们可以看到输出的字典,其中包含输入字符串中每个字母出现的次数。

这个问题是编程练习、数据处理和面试中常见的问题。它考核了您对字符串操作、条件判断和字典操作的理解。通过解决这类问题,您可以更好地了解如何在Python中处理文本数据。

四、题目:矩阵转置

给定一个矩阵,编写一个函数来将它转置。矩阵的转置是指将矩阵的行和列互换。

问题要求:您的函数应接受一个二维列表(作为矩阵)作为输入,并返回其转置。

以下是完成此任务的Python代码:

def transpose_matrix(matrix):
    # 利用Python的zip函数和列表推导式进行矩阵转置
    return [list(row) for row in zip(*matrix)]

# 示例输入
input_matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 输出:[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
print(transpose_matrix(input_matrix))

代码注释解释:

  1. 首先,我们定义了一个名为transpose_matrix的函数,该函数接受一个二维列表matrix作为输入。

  2. 在函数内部,我们使用Python的zip函数和列表推导式对matrix进行转置。zip(*matrix)实际上是将matrix的每一列组成一个元组,然后我们对这些元组进行遍历,并将每个元组转换为列表,这样就完成了转置。

  3. 为了测试这个函数,我们提供了一个3x3矩阵input_matrix作为输入。运行函数并打印其结果,我们可以看到输出的矩阵是输入矩阵的转置。

这个问题是编程练习、算法竞赛和面试中的常见问题。它考核了您对二维列表的理解、以及对Python内置函数如zip的熟练应用。这种问题也经常在处理数学和数据科学问题中出现,因为矩阵的转置是线性代数中的基本操作。

五、题目:合并有序列表

给定两个有序的列表,编写一个函数将它们合并为一个新的有序列表。

问题要求:您的函数应该分别接受两个升序整数列表作为输入,并返回一个合并后的新列表。假设两个列表的长度可以不同。

以下是完成该任务的Python代码:

def merge_sorted_lists(list1, list2):
    # 初始化一个空列表,它将存储合并后的有序列表
    merged_list = []
    
    # 初始化两个指针,分别用于遍历两个输入列表
    idx1, idx2 = 0, 0
    
    # 遍历两个列表,直到其中一个列表结束
    while idx1 < len(list1) and idx2 < len(list2):
        if list1[idx1] < list2[idx2]:
            merged_list.append(list1[idx1])
            idx1 += 1
        else:
            merged_list.append(list2[idx2])
            idx2 += 2

    # 将未添加的剩余元素添加到合并后的列表中
    merged_list += list1[idx1:] + list2[idx2:]

    return merged_list

# 示例输入
input_list1 = [1, 3, 5, 8]
input_list2 = [2, 4, 7, 9, 11]

# 输出: [1, 2, 3, 4, 5, 7, 8, 9, 11]
print(merge_sorted_lists(input_list1, input_list2))

代码注释解释:

  1. 首先,我们定义了一个名为merge_sorted_lists的函数,它接受两个列表list1list2作为输入。

  2. 在函数内部,我们创建一个名为merged_list的空列表,它将存储合并后的有序列表。

  3. 然后,我们初始化两个指针idx1idx2,分别用于遍历两个输入列表。

  4. 使用while循环,我们遍历两个列表,直到其中一个列表结束。在循环内部,我们比较两个列表当前元素的大小,将较小的元素添加到merged_list中,并移动相应的指针。

  5. 当其中一个列表结束时,我们将另一个列表的剩余元素添加到merged_list中。因为两个输入列表都是有序的,所以剩余的元素也是有序的。

  6. 最后,我们返回合并后的有序列表merged_list

  7. 为了测试这个函数,我们提供了两个升序整数列表input_list1input_list2作为输入。运行函数并打印其结果,我们可以看到输出的列表是两个输入列表的有序合并。

这个问题是编程练习、算法竞赛和面试中的常见问题。它考验了您对列表操作、条件判断和循环遍历的理解。解决这类问题,您可以更好地了解在Python中处理数字序列和数据集的方法。

六、题目:回文检测

给定一个字符串,编写一个函数来检查它是否是回文。回文是指从前往后和从后往前读都一样的序列。

问题要求:函数应接受一个字符串作为输入参数,并返回一个布尔值,true表示输入字符串是个回文,false表示不是。

以下是完成此任务的Python代码:

def is_palindrome(s):
    # 检查通过从前往后和从后往前读是否相同
    return s == s[::-1]

# 示例输入
input_string = "madam"

# 输出:True
print(is_palindrome(input_string))

代码注释解释:

  1. 我们定义了一个名为is_palindrome的函数,该函数接受一个字符串's'作为输入。

  2. 在函数内部,我们使用Python的切片操作's[::-1]'反转字符串's',然后检查反转后的字符串是否与原始字符串相同。如果相同,则字符串是回文,函数返回'True';否则,函数返回'False'

  3. 为了测试这个函数,我们提供了一个字符串input_string = "madam"作为输入。运行函数并打印其结果,我们可以看到输出结果为'True',这表示字符串'madam'确实是一个回文。

此问题是编程练习、算法竞赛和面试中的常见问题。它考察了你对字符串操作和条件判断的理解和使用能力。同时,通过这个练习,你可能会对Python的切片操作有更深入的理解和熟悉。

七、题目:斐波那契数列

斐波那契数列是一个常见的数学序列,它的每一项都是前两项的和。序列的前两项是0和1。

问题要求:需要编写一个函数,它应接受一个整数n作为输入,并返回斐波那契数列的第n项。

以下是完成此任务的Python代码:

def fibonacci(n):
    if n <= 0:
        return "输入参数应为正整数。"
    elif n == 1:
        return 0
    elif n == 2:
        return 1
    else:
        fib = [0, 1]
        for i in range(2, n):
            fib.append(fib[i-1] + fib[i-2])
        return fib[-1]

# 示例输入
input_number = 7

# 输出: 8 (因为斐波那契数列的前7项是:0, 1, 1, 2, 3, 5, 8)
print(fibonacci(input_number))

代码注释解释:

  1. 我们定义了一个名为fibonacci的函数,该函数接受一个整数n作为输入。

  2. 在函数内部,我们首先检查n的值。如果n小于等于0,则返回错误信息。如果n等于1,返回斐波那契数列的第一个数(0)。如果n等于2,返回斐波那契数列的第二个数(1)。

  3. 如果n的值大于2,我们使用一个列表fib来存储斐波那契数列,该列表的初始值为[0, 1]。然后,我们用一个for循环来计算斐波那契数列的剩余项。每个新的项是其前两项之和,可以使用 fib.append(fib[i-1] + fib[i-2]) 来添加到列表 fib中。

  4. 最后,我们返回列表fib的最后一个元素,该元素是斐波那契数列的第n项。

  5. 为了测试这个函数,我们提供了一个整数input_number = 7作为输入。运行函数并打印其结果,我们可以看到输出结果为8,这表示斐波那契数列的第7项是8。

此问题是编程练习、算法竞赛和面试中的常见问题。它考察了你对循环、列表操作和条件判断的理解和使用能力。同时,通过解决这个问题,你可能会对斐波那契数列有更深入的理解。

八、题目:找出数组中的重复数字

给定一个整数数组,数组中的数字可能会重复。要求编写一个函数,找出数组中重复的数字并返回他们。

以下是完成此任务的Python代码:

def find_duplicates(nums):
    num_set = set()
    duplicates = []
    
    for num in nums:
        if num in num_set:
            duplicates.append(num)
        num_set.add(num)
        
    return duplicates

# 示例输入
input_array = [1, 2, 2, 3, 4, 5, 5, 6, 7]

# 输出:[2, 5]
print(find_duplicates(input_array))

代码注释解释:

  1. 我们定义了一个名为find_duplicates的函数,该函数接受一个整数数组nums作为输入。

  2. 在函数内部,我们首先创建了一个空的集合num_set和一个空的列表duplicates。集合num_set用于存储出现过的数字,列表duplicates用于存储出现过两次或以上的数字。

  3. 我们遍历整个nums数组。对于数组中的每一个数字,我们检查它是否已经在num_set中。如果它已经在num_set中,那么它是重复的,我们将它添加到duplicates列表中。无论它是否重复,我们都将它添加到num_set中。

  4. 最后,我们返回duplicates列表,这就是数组中所有重复的数字。

  5. 我们为这个函数提供了一个数组input_array = [1, 2, 2, 3, 4, 5, 5, 6, 7]作为输入。当我们运行函数并打印结果时,我们看到输出结果为[2, 5],这就是数组中的重复数字。

此问题是编程练习、算法竞赛和面试中的常见问题。它考察了你对集合的使用,以及如何使用集合和列表处理重复检查的问题。这个问题也将帮助你更好的理解Python中的数据结构set和list的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值