花了一周时间,小编精选了10道Python核心练习题。如果你能独立完成这些题目,说明你已经扎实掌握了Python基础!这些题目覆盖字符串操作、循环控制、函数递归等核心知识点,每道题都提供3+种解法,带你体验Python的灵活魅力。
题目1:翻转字符串
要求:不适用reverse()
和切片语法
# 解法1:栈结构(后进先出)
def reverse_str(s):
stack = []
for char in s:
stack.append(char)
return ''.join(stack.pop() for _ in range(len(stack)))
# 解法2:递归分解
def reverse_rec(s):
return s if len(s) <= 1 else reverse_rec(s[1:]) + s[0]
# 解法3:双指针交换
def reverse_two_pointers(s):
chars = list(s)
left, right = 0, len(chars)-1
while left < right:
chars[left], chars[right] = chars[right], chars[left]
left += 1
right -= 1
return ''.join(chars)
题目2:斐波那契数列
要求:生成前n项,禁止直接调库
# 解法1:迭代法(内存最优)
def fib_iter(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b
# 解法2:递归+缓存(避免重复计算)
from functools import lru_cache
@lru_cache(maxsize=None)
def fib_rec(n):
return n if n < 2 else fib_rec(n-1) + fib_rec(n-2)
# 解法3:动态规划(O(n)时间复杂度)
def fib_dp(n):
dp = [0, 1]
for i in range(2, n+1):
dp.append(dp[i-1] + dp[i-2])
return dp[:n]
题目3:质数检测器
要求:判断数字是否为质数,优化计算效率
# 解法1:试除法优化(检测到平方根)
def is_prime(n):
if n < 2: return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
# 解法2:埃拉托斯特尼筛法(批量检测)
def primes_eratosthenes(n):
is_prime = [True]*(n+1)
for i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i in range(2, n+1) if is_prime[i]]
题目4:列表去重
要求:保持原始顺序
# 解法1:字典键保持顺序(Python 3.6+)
def deduplicate(lst):
return list(dict.fromkeys(lst))
# 解法2:集合+列表推导
def deduplicate_set(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
# 解法3:双指针原地修改
def deduplicate_inplace(lst):
i = 0
while i < len(lst):
if lst[i] in lst[:i]:
lst.pop(i)
else:
i += 1
return lst
题目5:9×9乘法表
要求:对齐打印输出
# 解法1:嵌套循环
for i in range(1, 10):
for j in range(1, i+1):
print(f"{j}×{i}={i*j:2d}", end='\t')
print()
# 解法2:单行列表推导式
print('\n'.join(['\t'.join([f"{j}×{i}={i*j:2d}" for j in range(1, i+1)]) for i in range(1, 10)]))
# 解法3:使用f-string对齐
for i in range(1, 10):
line = ' '.join([f"{j}×{i}={i*j:<2}" for j in range(1, i+1)])
print(line.center(60))
题目6:词频统计
要求:统计文本中单词频率
# 解法1:collections.Counter
from collections import Counter
def word_count(text):
return Counter(text.split())
# 解法2:字典手动统计
def word_count_dict(text):
wc = {}
for word in text.split():
wc[word] = wc.get(word, 0) + 1
return wc
# 解法3:字典推导式+set
def word_count_comprehension(text):
words = text.split()
return {word: words.count(word) for word in set(words)}
题目7:最大公约数
要求:实现两种算法
# 解法1:欧几里得算法(辗转相除)
def gcd_euclid(a, b):
while b:
a, b = b, a % b
return a
# 解法2:更相减损术
def gcd_subtraction(a, b):
while a != b:
if a > b:
a = a - b
else:
b = b - a
return a
# 解法3:递归实现
def gcd_recursive(a, b):
return a if b == 0 else gcd_recursive(b, a % b)
题目8:汉诺塔问题
要求:打印移动步骤
def hanoi(n, source, target, auxiliary):
if n == 1:
print(f"移动圆盘 1 从 {source} 到 {target}")
return
hanoi(n-1, source, auxiliary, target)
print(f"移动圆盘 {n} 从 {source} 到 {target}")
hanoi(n-1, auxiliary, target, source)
# 调用示例
hanoi(3, 'A', 'C', 'B')
题目9:回文检测
要求:忽略大小写和标点
import re
# 解法1:字符串清洗+反转比对
def is_palindrome(text):
clean = re.sub(r'[^\w]', '', text.lower())
return clean == clean[::-1]
# 解法2:双指针检测
def is_palindrome_two_pointer(text):
clean = re.sub(r'[^\w]', '', text.lower())
left, right = 0, len(clean)-1
while left < right:
if clean[left] != clean[right]:
return False
left += 1
right -= 1
return True
题目10:两数之和
要求:O(n)时间复杂度解法
# 哈希表解法(最优)
def two_sum(nums, target):
num_map = {}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return [num_map[complement], i]
num_map[num] = i
return []
# 测试用例
print(two_sum([2, 7, 11, 15], 9)) # 输出 [0, 1]