编程是一项需要不断学习和实践的技术。对于程序员来说,通过刷题来巩固和提升编程能力是一种非常有效的方法。以下是一份包含100道经典编程题目的攻略,旨在帮助程序员掌握编程的核心技能。
1. 排序算法
冒泡排序
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
快速排序
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
2. 字符串处理
翻转字符串
def reverse_string(s):
return s[::-1]
字符串匹配
def is_substring(s1, s2):
return s2 in s1
3. 数组操作
找出数组中的重复元素
def find_duplicates(arr):
return [x for x in arr if arr.count(x) > 1]
数组中两个数的和等于目标值
def two_sum(arr, target):
seen = {}
for i, x in enumerate(arr):
if target - x in seen:
return [seen[target - x], i]
seen[x] = i
return []
4. 图算法
深度优先搜索
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for next_node in graph[start]:
if next_node not in visited:
dfs(graph, next_node, visited)
return visited
广度优先搜索
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
while queue:
vertex = queue.popleft()
if vertex not in visited:
visited.add(vertex)
for next_node in graph[vertex]:
if next_node not in visited:
queue.append(next_node)
return visited
5. 动态规划
斐波那契数列
def fibonacci(n):
if n <= 1:
return n
a, b = 0, 1
for _ in range(2, n+1):
a, b = b, a + b
return b
最长公共子序列
def lcs(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]
6. 算法思维
鸡蛋掉落问题
假设你总共有 k 个鸡蛋,你想知道最少需要多少次尝试来找到放置鸡蛋的临界楼层。这是一个经典的动态规划问题。
def egg_drop(n, k):
dp = [[0] * (k+1) for _ in range(n+1)]
for i in range(1, n+1):
dp[i][1] = i
for j in range(2, k+1):
dp[i][j] = float('inf')
for x in range(1, i+1):
res = 1 + max(dp[x-1][j-1], dp[i-x][j])
dp[i][j] = min(dp[i][j], res)
return dp[n][k]
7. 数据结构
链表
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def linked_list_to_array(head):
arr = []
while head:
arr.append(head.val)
head = head.next
return arr
栈
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def is_empty(self):
return len(self.items) == 0
8. 设计模式
单例模式
class Singleton:
_instance = None
@staticmethod
def get_instance():
if Singleton._instance is None:
Singleton._instance = Singleton()
return Singleton._instance
工厂模式
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
class AnimalFactory:
@staticmethod
def get_animal(animal_type):
if animal_type == "dog":
return Dog()
elif animal_type == "cat":
return Cat()
else:
raise ValueError("Unknown animal type")
9. 编程竞赛技巧
时间复杂度
在编程竞赛中,理解并分析算法的时间复杂度是非常重要的。以下是一些常见的时间复杂度:
- O(1):常数时间复杂度,例如访问数组中的一个元素。
- O(n):线性时间复杂度,例如遍历数组。
- O(n^2):平方时间复杂度,例如双重循环遍历数组。
- O(log n):对数时间复杂度,例如二分查找。
- O(n log n):线性对数时间复杂度,例如归并排序。
数据结构
在编程竞赛中,熟悉常用的数据结构对于解决算法问题至关重要。以下是一些常用的数据结构:
- 数组
- 链表
- 栈
- 队列
- 树
- 图
编码规范
在编程竞赛中,遵循良好的编码规范可以提高代码的可读性和可维护性。以下是一些常见的编码规范:
- 使用有意义的变量名和函数名。
- 使用缩进和空格来提高代码的可读性。
- 使用注释来解释代码的逻辑。
- 遵循代码风格指南。
总结
以上是100道经典编程题目的攻略,涵盖了排序算法、字符串处理、数组操作、图算法、动态规划、算法思维、数据结构、设计模式和编程竞赛技巧等多个方面。通过刷题,你可以巩固和提升编程能力,为成为一名优秀的程序员打下坚实的基础。
