python 面试算法题

1.第一题

题目描述:给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。
s 的 旋转操作 就是将 s 最左边的字符移动到最右边。
例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。
示例一:
输入: s = "abcde", goal = "cdeab"
输出: True
示例二:
输入: s = "abcde", goal = "abced"
输出: False
def t(str1,nums):
    goal = str1[nums:] + str1[:nums]
    # print(goal)
    if str(a) == str(goal):
        return True
    elif str(a) != str(goal):
        return False

if __name__ == '__main__':
    #第一题
    str1 = "abcde"
    for i in range(len(str1)):
        a = input(f"第{i}次请输入:")
        print(t(str1,i))

2.10以内的质数

def zs(n):
    if isinstance(n,int) and n%2!=0 and n>0 and n != 1 :
        return n

if __name__ == '__main__':
    a = []
    for i in range(1,11):
        if zs(int(i)) is not None:
            a.append(zs(int(i)))
    print(a)

<think>嗯,用户这次明确要求获取Python面试算法题及答案,而且从对话历史看,系统要求必须结构化回答并附带相关问题。用户提供的三个引用内容其实挺有价值:引用[1]展示了列表解析的经典例子,引用[2]给出了栈的实现,引用[3]解释了Python的除法特性——这些恰好都是算法题的高频考点。 考虑到用户正在准备面试,应该按算法分类整理核心题目。不过用户之前的示例(快速排序)用了代码块加注释的形式,这个格式反馈很好,可以延续。需要特别注意两点:一是题目必须典型(比如链表、树这些基本躲不掉),二是答案要体现Python特性(比如用yield实现生成器比Java风格的迭代器更pythonic)。 突然想到引用[3]提到的整除特性容易被忽视,应该在整数题目的答案解析里强调。例如翻转整数时的取模运算,用//处理负数就和C语言行为不同——这种细节面试官爱考。对了,系统还要求数学公式用LaTeX,像大O复杂度分析就需要写成$O(n)$。 用户可能更需要实战代码而非理论描述,所以每个算法都配可运行的代码片段比较实用(比如引用[2]的栈实现就直接可用)。不过DFS这种递归算法得提醒Python递归深度限制,算是埋个优化伏笔。 最后生成的问题要覆盖延伸方向:引用[1][2][3]分别对应语法、并发、运算特性,所以相关问题设计成优化技巧、并发场景应用、边界case处理就很全面。特别要加动态规划——面试必考但引用里没提,得补全。 </think>以下是经典的Python面试算法题及答案解析,包含代码实现和关键知识点说明: --- ### 一、基础算法题 #### 1. 反转字符串 **题目**:编写函数反转字符串。 **答案**: ```python def reverse_string(s: str) -> str: return s[::-1] # 测试 print(reverse_string("hello")) # 输出 "olleh" ``` **关键点**:切片操作$s[::-1]$时间复杂度$O(n)$,空间复杂度$O(1)$[^1]。 --- #### 2. 判断回文数 **题目**:不将整数转为字符串,判断整数是否是回文数。 **答案**: ```python def is_palindrome(x: int) -> bool: if x < 0: return False rev, num = 0, x while num: rev = rev * 10 + num % 10 num //= 10 # 注意Python整除特性[^3] return rev == x print(is_palindrome(121)) # True ``` **关键点**:通过取余(`%`)和整除(`//`)反转数字,注意负数直接返回False。 --- ### 二、数据结构题 #### 1. 实现栈(Stack) **题目**:用列表实现栈的基本操作(push/pop/peek)。 **答案**: ```python class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) # 入栈 def pop(self): if not self.is_empty(): return self.items.pop() # 出栈 def peek(self): if not self.is_empty(): return self.items[-1] # 查看栈顶 def is_empty(self): return len(self.items) == 0 def size(self): return len(self.items) ``` **说明**:直接利用列表的`append()`和`pop()`实现$O(1)$操作[^2]。 --- #### 2. 链表反转 **题目**:反转单链表。 **答案**: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverse_list(head: ListNode) -> ListNode: prev = None curr = head while curr: next_temp = curr.next curr.next = prev prev = curr curr = next_temp return prev ``` **关键点**:三指针法(prev/curr/next),时间复杂度$O(n)$。 --- ### 三、算法优化题 #### 1. 斐波那契数列(优化版) **题目**:避免递归重复计算,用动态规划实现。 **答案**: ```python def fibonacci(n: int) -> int: if n <= 1: return n a, b = 0, 1 for _ in range(2, n+1): a, b = b, a + b return b print(fibonacci(10)) # 55 ``` **优化点**:空间复杂度从递归的$O(2^n)$降至$O(1)$[^1]。 --- #### 2. 两数之和 **题目**:在数组中找到两个数,使它们的和等于目标值。 **答案**: ```python def two_sum(nums: list, target: int) -> list: hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i return [] print(two_sum([2, 7, 11, 15], 9)) # [0, 1] ``` **关键点**:哈希表将查找时间从$O(n^2)$优化到$O(n)$[^1]。 --- ### 四、高级算法 #### 二叉树层序遍历 **题目**:返回二叉树的层序遍历结果。 **答案**: ```python from collections import deque class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def level_order(root: TreeNode) -> list: if not root: return [] queue = deque([root]) result = [] while queue: level = [] for _ in range(len(queue)): node = queue.popleft() level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) result.append(level) return result ``` **核心**:队列实现BFS,时间复杂度$O(n)$[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XuMeng_first

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

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

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

打赏作者

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

抵扣说明:

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

余额充值