deffilter_strings(data): defok(s: str) -> bool: ifnot s: returnTrue# 空串视为满足 freq = Counter(s) returnmax(freq.values()) <= len(s) / 2 return [s for s in data if ok(s)]
defprimes_upto(n: int = 1000): if n < 2: return [] sieve = [True] * (n + 1) sieve[0] = sieve[1] = False import math for p inrange(2, int(math.isqrt(n)) + 1): if sieve[p]: step = p start = p * p sieve[start:n + 1:step] = [False] * len(range(start, n + 1, step)) return [i for i, is_prime inenumerate(sieve) if is_prime and i < n]
print(primes_upto(1000))
13(续)为什么尽量从列表尾部进行元素的增加与删除?
简要分析
列表底层是动态数组;在头部插入/删除需要整体搬移元素,时间复杂度约 O(n)。
尾部的 append() / pop() 为摊还 O(1),更高效且更少内存拷贝。
14. 生成 1000 个 0~100 的随机整数,并统计出现次数
简要分析
用 random.randint 生成数据;用 collections.Counter 或字典计数
1 2 3 4 5 6 7 8
import random from collections import Counter
nums = [random.randint(0, 100) for _ inrange(1000)] cnt = Counter(nums)