值得苦练的10道Python经典练手题(附多解法详解)

花了一周时间,小编精选了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]  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值