Skip to content

Commit 8f1cebb

Browse files
authored
Merge branch 'krahets:main' into yuelinxin-en
2 parents fcd77bb + 0774920 commit 8f1cebb

File tree

202 files changed

+2437
-193
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

202 files changed

+2437
-193
lines changed

codes/c/chapter_stack_and_queue/array_stack.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ int main() {
9090

9191
/* 获取栈的长度 */
9292
int size = stack->size;
93-
printf("栈的长度 size = %d\n", size);
93+
printf("栈的长度 size = %d\n", size);
9494

9595
/* 判断是否为空 */
9696
bool empty = isEmpty(stack);
97-
printf("栈是否为空 = %stack\n", empty ? "true" : "false");
97+
printf("栈是否为空 = %s\n", empty ? "true" : "false");
9898

9999
// 释放内存
100100
delArrayStack(stack);

codes/go/chapter_stack_and_queue/array_deque.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ func (q *arrayDeque) pushLast(num int) {
7272
/* 队首出队 */
7373
func (q *arrayDeque) popFirst() any {
7474
num := q.peekFirst()
75+
if num == nil {
76+
return nil
77+
}
7578
// 队首指针向后移动一位
7679
q.front = q.index(q.front + 1)
7780
q.queSize--
@@ -81,6 +84,9 @@ func (q *arrayDeque) popFirst() any {
8184
/* 队尾出队 */
8285
func (q *arrayDeque) popLast() any {
8386
num := q.peekLast()
87+
if num == nil {
88+
return nil
89+
}
8490
q.queSize--
8591
return num
8692
}

codes/go/chapter_stack_and_queue/array_queue.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ func (q *arrayQueue) push(num int) {
4949
/* 出队 */
5050
func (q *arrayQueue) pop() any {
5151
num := q.peek()
52+
if num == nil {
53+
return nil
54+
}
55+
5256
// 队首指针向后移动一位,若越过尾部,则返回到数组头部
5357
q.front = (q.front + 1) % q.queCapacity
5458
q.queSize--

codes/go/chapter_stack_and_queue/queue_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,13 @@ func TestQueue(t *testing.T) {
4646
}
4747

4848
func TestArrayQueue(t *testing.T) {
49+
4950
// 初始化队列,使用队列的通用接口
5051
capacity := 10
5152
queue := newArrayQueue(capacity)
53+
if queue.pop() != nil {
54+
t.Errorf("want:%v,got:%v", nil, queue.pop())
55+
}
5256

5357
// 元素入队
5458
queue.push(1)

codes/kotlin/chapter_sorting/merge_sort.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ fun merge(nums: IntArray, left: Int, mid: Int, right: Int) {
1919
while (i <= mid && j <= right) {
2020
if (nums[i] <= nums[j])
2121
tmp[k++] = nums[i++]
22-
else
22+
else
2323
tmp[k++] = nums[j++]
2424
}
2525
// 将左子数组和右子数组的剩余元素复制到临时数组中

codes/python/chapter_computational_complexity/time_complexity.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ def linear_log_recur(n: int) -> int:
9797
"""线性对数阶"""
9898
if n <= 1:
9999
return 1
100-
count: int = linear_log_recur(n // 2) + linear_log_recur(n // 2)
100+
# 一分为二,子问题的规模减小一半
101+
count = linear_log_recur(n // 2) + linear_log_recur(n // 2)
102+
# 当前子问题包含 n 个操作
101103
for _ in range(n):
102104
count += 1
103105
return count
@@ -120,32 +122,32 @@ def factorial_recur(n: int) -> int:
120122
n = 8
121123
print("输入数据大小 n =", n)
122124

123-
count: int = constant(n)
125+
count = constant(n)
124126
print("常数阶的操作数量 =", count)
125127

126-
count: int = linear(n)
128+
count = linear(n)
127129
print("线性阶的操作数量 =", count)
128-
count: int = array_traversal([0] * n)
130+
count = array_traversal([0] * n)
129131
print("线性阶(遍历数组)的操作数量 =", count)
130132

131-
count: int = quadratic(n)
133+
count = quadratic(n)
132134
print("平方阶的操作数量 =", count)
133135
nums = [i for i in range(n, 0, -1)] # [n, n-1, ..., 2, 1]
134-
count: int = bubble_sort(nums)
136+
count = bubble_sort(nums)
135137
print("平方阶(冒泡排序)的操作数量 =", count)
136138

137-
count: int = exponential(n)
139+
count = exponential(n)
138140
print("指数阶(循环实现)的操作数量 =", count)
139-
count: int = exp_recur(n)
141+
count = exp_recur(n)
140142
print("指数阶(递归实现)的操作数量 =", count)
141143

142-
count: int = logarithmic(n)
144+
count = logarithmic(n)
143145
print("对数阶(循环实现)的操作数量 =", count)
144-
count: int = log_recur(n)
146+
count = log_recur(n)
145147
print("对数阶(递归实现)的操作数量 =", count)
146148

147-
count: int = linear_log_recur(n)
149+
count = linear_log_recur(n)
148150
print("线性对数阶(递归实现)的操作数量 =", count)
149151

150-
count: int = factorial_recur(n)
152+
count = factorial_recur(n)
151153
print("阶乘阶(递归实现)的操作数量 =", count)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
=begin
2+
File: climbing_stairs_backtrack.rb
3+
Created Time: 2024-05-29
4+
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
5+
=end
6+
7+
### 回溯 ###
8+
def backtrack(choices, state, n, res)
9+
# 当爬到第 n 阶时,方案数量加 1
10+
res[0] += 1 if state == n
11+
# 遍历所有选择
12+
for choice in choices
13+
# 剪枝:不允许越过第 n 阶
14+
next if state + choice > n
15+
16+
# 尝试:做出选择,更新状态
17+
backtrack(choices, state + choice, n, res)
18+
end
19+
# 回退
20+
end
21+
22+
### 爬楼梯:回溯 ###
23+
def climbing_stairs_backtrack(n)
24+
choices = [1, 2] # 可选择向上爬 1 阶或 2 阶
25+
state = 0 # 从第 0 阶开始爬
26+
res = [0] # 使用 res[0] 记录方案数量
27+
backtrack(choices, state, n, res)
28+
res.first
29+
end
30+
31+
### Driver Code ###
32+
if __FILE__ == $0
33+
n = 9
34+
35+
res = climbing_stairs_backtrack(n)
36+
puts "爬 #{n} 阶楼梯共有 #{res} 种方案"
37+
end
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=begin
2+
File: climbing_stairs_constraint_dp.rb
3+
Created Time: 2024-05-29
4+
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
5+
=end
6+
7+
### 带约束爬楼梯:动态规划 ###
8+
def climbing_stairs_constraint_dp(n)
9+
return 1 if n == 1 || n == 2
10+
11+
# 初始化 dp 表,用于存储子问题的解
12+
dp = Array.new(n + 1) { Array.new(3, 0) }
13+
# 初始状态:预设最小子问题的解
14+
dp[1][1], dp[1][2] = 1, 0
15+
dp[2][1], dp[2][2] = 0, 1
16+
# 状态转移:从较小子问题逐步求解较大子问题
17+
for i in 3...(n + 1)
18+
dp[i][1] = dp[i - 1][2]
19+
dp[i][2] = dp[i - 2][1] + dp[i - 2][2]
20+
end
21+
22+
dp[n][1] + dp[n][2]
23+
end
24+
25+
### Driver Code ###
26+
if __FILE__ == $0
27+
n = 9
28+
29+
res = climbing_stairs_constraint_dp(n)
30+
puts "爬 #{n} 阶楼梯共有 #{res} 种方案"
31+
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
=begin
2+
File: climbing_stairs_dfs.rb
3+
Created Time: 2024-05-29
4+
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
5+
=end
6+
7+
### 搜索 ###
8+
def dfs(i)
9+
# 已知 dp[1] 和 dp[2] ,返回之
10+
return i if i == 1 || i == 2
11+
# dp[i] = dp[i-1] + dp[i-2]
12+
dfs(i - 1) + dfs(i - 2)
13+
end
14+
15+
### 爬楼梯:搜索 ###
16+
def climbing_stairs_dfs(n)
17+
dfs(n)
18+
end
19+
20+
### Driver Code ###
21+
if __FILE__ == $0
22+
n = 9
23+
24+
res = climbing_stairs_dfs(n)
25+
puts "爬 #{n} 阶楼梯共有 #{res} 种方案"
26+
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
=begin
2+
File: climbing_stairs_dfs_mem.rb
3+
Created Time: 2024-05-29
4+
Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
5+
=end
6+
7+
### 记忆化搜索 ###
8+
def dfs(i, mem)
9+
# 已知 dp[1] 和 dp[2] ,返回之
10+
return i if i == 1 || i == 2
11+
# 若存在记录 dp[i] ,则直接返回之
12+
return mem[i] if mem[i] != -1
13+
14+
# dp[i] = dp[i-1] + dp[i-2]
15+
count = dfs(i - 1, mem) + dfs(i - 2, mem)
16+
# 记录 dp[i]
17+
mem[i] = count
18+
end
19+
20+
### 爬楼梯:记忆化搜索 ###
21+
def climbing_stairs_dfs_mem(n)
22+
# mem[i] 记录爬到第 i 阶的方案总数,-1 代表无记录
23+
mem = Array.new(n + 1, -1)
24+
dfs(n, mem)
25+
end
26+
27+
### Driver Code ###
28+
if __FILE__ == $0
29+
n = 9
30+
31+
res = climbing_stairs_dfs_mem(n)
32+
puts "爬 #{n} 阶楼梯共有 #{res} 种方案"
33+
end

0 commit comments

Comments
 (0)