题目1:数列求和
题目描述
给定一个数列,求出该数列的和。
解题思路
使用循环结构遍历数列中的每个元素,将其累加到总和中。
代码示例
def sum_sequence(sequence):
total = 0
for number in sequence:
total += number
return total
# 测试
sequence = [1, 2, 3, 4, 5]
print(sum_sequence(sequence)) # 输出应为 15
题目2:最大公约数
题目描述
求两个正整数的最大公约数。
解题思路
使用辗转相除法(欧几里得算法)求解。
代码示例
def gcd(a, b):
while b:
a, b = b, a % b
return a
# 测试
print(gcd(48, 18)) # 输出应为 6
题目3:斐波那契数列
题目描述
编写一个函数,计算斐波那契数列的第n项。
解题思路
使用递归或循环结构计算斐波那契数列。
代码示例
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
# 测试
print(fibonacci(10)) # 输出应为 55
题目4:二分查找
题目描述
在一个已排序的数组中,查找一个特定的元素。
解题思路
使用二分查找算法,不断缩小查找范围。
代码示例
def binary_search(arr, target):
low, high = 0, len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
# 测试
arr = [1, 3, 5, 7, 9]
print(binary_search(arr, 5)) # 输出应为 2
题目5:汉诺塔
题目描述
编写一个函数,打印出将n个盘子从源塔移动到目标塔的步骤。
解题思路
使用递归方法,将问题分解为更小的子问题。
代码示例
def hanoi(n, source, target, auxiliary):
if n == 1:
print(f"Move disk 1 from {source} to {target}")
return
hanoi(n-1, source, auxiliary, target)
print(f"Move disk {n} from {source} to {target}")
hanoi(n-1, auxiliary, target, source)
# 测试
hanoi(3, 'A', 'C', 'B')
题目6:排列组合
题目描述
给定一个字符串,输出所有可能的排列。
解题思路
使用递归方法,将问题分解为更小的子问题。
代码示例
def permutations(s):
if len(s) == 1:
return [s]
result = []
for i in range(len(s)):
m = s[i]
rem = s[:i] + s[i+1:]
for p in permutations(rem):
result.append(m + p)
return result
# 测试
print(permutations("abc")) # 输出应为 ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
题目7:素数检测
题目描述
编写一个函数,判断一个数是否为素数。
解题思路
使用试除法,从2开始,检查到该数的平方根。
代码示例
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
# 测试
print(is_prime(29)) # 输出应为 True
题目8:汉明距离
题目描述
给定两个字符串,计算它们之间的汉明距离。
解题思路
使用异或运算,统计两个字符串对应位置上不同字符的数量。
代码示例
def hamming_distance(s1, s2):
return bin(s1 ^ s2).count('1')
# 测试
print(hamming_distance("1001", "1110")) # 输出应为 3
题目9:最长公共子序列
题目描述
给定两个字符串,找出它们的最长公共子序列。
解题思路
使用动态规划,构建一个二维数组来存储子问题的解。
代码示例
def longest_common_subsequence(X, Y):
m, n = len(X), len(Y)
L = [[None] * (n + 1) for i in range(m + 1)]
for i in range(m + 1):
for j in range(n + 1):
if i == 0 or j == 0:
L[i][j] = 0
elif X[i - 1] == Y[j - 1]:
L[i][j] = L[i - 1][j - 1] + 1
else:
L[i][j] = max(L[i - 1][j], L[i][j - 1])
return L[m][n]
# 测试
print(longest_common_subsequence("AGGTAB", "GXTXAYB")) # 输出应为 4
题目10:最大子数组和
题目描述
给定一个整数数组,找出一个具有最大子数组和的连续子数组。
解题思路
使用动态规划,记录到当前位置为止的最大子数组和。
代码示例
def max_subarray_sum(arr):
max_so_far = max_ending_here = arr[0]
for x in arr[1:]:
max_ending_here = max(x, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
# 测试
print(max_subarray_sum([-2, 1, -3, 4, -1, 2, 1, -5, 4])) # 输出应为 6
题目11:合并区间
题目描述
给定一个区间列表,合并所有重叠的区间。
解题思路
对区间进行排序,然后合并重叠的区间。
代码示例
def merge_intervals(intervals):
if not intervals:
return []
intervals.sort(key=lambda x: x[0])
merged = [intervals[0]]
for current in intervals[1:]:
prev_start, prev_end = merged[-1]
curr_start, curr_end = current
if prev_end >= curr_start:
merged[-1] = (prev_start, max(prev_end, curr_end))
else:
merged.append(current)
return merged
# 测试
print(merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]])) # 输出应为 [[1, 6], [8, 10], [15, 18]]
题目12:二叉树遍历
题目描述
编写一个函数,实现二叉树的先序、中序和后序遍历。
解题思路
使用递归方法,分别按照先序、中序和后序遍历的规则访问节点。
代码示例
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def preorder_traversal(root):
if root:
print(root.val, end=' ')
preorder_traversal(root.left)
preorder_traversal(root.right)
def inorder_traversal(root):
if root:
inorder_traversal(root.left)
print(root.val, end=' ')
inorder_traversal(root.right)
def postorder_traversal(root):
if root:
postorder_traversal(root.left)
postorder_traversal(root.right)
print(root.val, end=' ')
# 测试
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print("Preorder traversal:")
preorder_traversal(root)
print("\nInorder traversal:")
inorder_traversal(root)
print("\nPostorder traversal:")
postorder_traversal(root)
题目13:图遍历
题目描述
编写一个函数,实现图的深度优先搜索(DFS)和广度优先搜索(BFS)。
解题思路
使用递归方法实现DFS,使用队列实现BFS。
代码示例
def dfs(graph, start):
visited = set()
stack = [start]
while stack:
vertex = stack.pop()
if vertex not in visited:
visited.add(vertex)
print(vertex, end=' ')
stack.extend(graph[vertex] - visited)
def bfs(graph, start):
visited = set()
queue = [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
print(vertex, end=' ')
queue.extend(graph[vertex] - visited)
# 测试
graph = {
0: [1, 2],
1: [2],
2: [0, 3],
3: [3, 2]
}
print("DFS:")
dfs(graph, 0)
print("\nBFS:")
bfs(graph, 0)
题目14:动态规划 - 斐波那契数列
题目描述
使用动态规划算法计算斐波那契数列的第n项。
解题思路
使用一个数组来存储已经计算过的斐波那契数,避免重复计算。
代码示例
def fibonacci_dp(n):
if n <= 1:
return n
fib = [0, 1]
for i in range(2, n + 1):
fib.append(fib[i - 1] + fib[i - 2])
return fib[n]
# 测试
print(fibonacci_dp(10)) # 输出应为 55
题目15:动态规划 - 最长递增子序列
题目描述
给定一个无序数组,找出最长递增子序列的长度。
解题思路
使用动态规划,记录到当前位置为止的最长递增子序列长度。
代码示例
def longest_increasing_subsequence(arr):
n = len(arr)
lis = [1] * n
for i in range(1, n):
for j in range(0, i):
if arr[i] > arr[j] and lis[i] < lis[j] + 1:
lis[i] = lis[j] + 1
return max(lis)
# 测试
print(longest_increasing_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80])) # 输出应为 6
题目16:动态规划 - 背包问题
题目描述
给定一个物品列表和背包容量,找出能够装入背包的物品的最大价值。
解题思路
使用动态规划,构建一个二维数组来存储子问题的解。
代码示例
def knapsack(weights, values, capacity):
n = len(values)
dp = [[0] * (capacity + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(1, capacity + 1):
if weights[i - 1] <= w:
dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w])
else:
dp[i][w] = dp[i - 1][w]
return dp[n][capacity]
# 测试
weights = [1, 2, 4, 5]
values = [1, 4, 5, 7]
capacity = 8
print(knapsack(weights, values, capacity)) # 输出应为 9
题目17:贪心算法 - 最小硬币找零
题目描述
给定一个硬币的面额数组和一个找零金额,找出最少数量的硬币组合。
解题思路
使用贪心算法,从最大面额的硬币开始,尽量使用更多的硬币。
代码示例
def coin_change(coins, amount):
coins.sort(reverse=True)
count = 0
for coin in coins:
count += amount // coin
amount %= coin
return count
# 测试
coins = [1, 2, 5]
amount = 11
print(coin_change(coins, amount)) # 输出应为 3
题目18:贪心算法 - 活动选择
题目描述
给定一个活动列表,每个活动都有一个开始时间和结束时间,选择一个最大数量的不相交活动。
解题思路
使用贪心算法,选择结束时间最早的活动,然后从下一个活动的开始时间开始继续选择。
代码示例
def activity_selection(start_times, end_times):
n = len(start_times)
activities = sorted(range(n), key=lambda i: end_times[i])
count = 1
last_end_time = end_times[activities[0]]
for i in range(1, n):
if start_times[activities[i]] >= last_end_time:
count += 1
last_end_time = end_times[activities[i]]
return count
# 测试
start_times = [1, 3, 0, 5, 8, 5]
end_times = [2, 4, 6, 7, 9, 9]
print(activity_selection(start_times, end_times)) # 输出应为 4
题目19:贪心算法 - 最短路径
题目描述
给定一个加权有向图,使用Dijkstra算法找到从源点到所有其他点的最短路径。
解题思路
使用贪心算法,每次选择当前未访问节点中距离源点最近的节点。
代码示例
import heapq
def dijkstra(graph, start):
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
priority_queue = [(0, start)]
while priority_queue:
current_distance, current_vertex = heapq.heappop(priority_queue)
if current_distance > distances[current_vertex]:
continue
for neighbor, weight in graph[current_vertex].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return distances
# 测试
graph = {
'A': {'B': 1, 'C': 4},
'B': {'C': 2, 'D': 5},
'C': {'D': 1},
'D': {}
}
print(dijkstra(graph, 'A')) # 输出应为 {'A': 0, 'B': 1, 'C': 3, 'D': 4}
题目20:贪心算法 - 股票买卖
题目描述
给定一个股票价格数组,找出最大利润的买卖点。
解题思路
使用贪心算法,每次卖出股票时,都要确保卖出价格高于买入价格。
代码示例
def max_profit(prices):
max_profit = 0
for i in range(1, len(prices)):
if prices[i] > prices[i - 1]:
max_profit += prices[i] - prices[i - 1]
return max_profit
# 测试
prices = [7, 1, 5, 3, 6, 4]
print(max_profit(prices)) # 输出应为 7
题目21:贪心算法 - 最长不重复子串
题目描述
给定一个字符串,找出最长的无重复字符子串的长度。
解题思路
使用贪心算法,使用一个滑动窗口来记录当前的最长不重复子串。
代码示例
def length_of_longest_substring(s):
start = 0
max_len = 0
char_index = {}
for end in range(len(s)):
if s[end] in char_index:
start = max(start, char_index[s[end]] + 1)
char_index[s[end]] = end
max_len = max(max_len, end - start + 1)
return max_len
# 测试
s = "abcabcbb"
print(length_of_longest_substring(s)) # 输出应为 3
题目22:贪心算法 - 最小硬币找零
题目描述
给定一个硬币的面额数组和一个找零金额,找出最少数量的硬币组合。
解题思路
使用贪心算法,从最大面额的硬币开始,尽量使用更多的硬币。
代码示例
def coin_change(coins, amount):
coins.sort(reverse=True)
count = 0
for coin in coins:
count += amount // coin
amount %= coin
return count
# 测试
coins = [1, 2, 5]
amount = 11
print(coin_change(coins, amount)) # 输出应为 3
题目23:贪心算法 - 活动选择
###
