Skip to content

Commit

Permalink
feat: modify some Dart codes and add Dart code blocks to the docs (#543)
Browse files Browse the repository at this point in the history
  • Loading branch information
gvenusleo authored Jun 2, 2023
1 parent 53e18bc commit 281c0c6
Show file tree
Hide file tree
Showing 25 changed files with 339 additions and 54 deletions.
18 changes: 8 additions & 10 deletions codes/dart/chapter_array_and_linkedlist/array.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

import 'dart:math';

/* 随机返回一个 数组元素 */
/* 随机返回一个数组元素 */
int randomAccess(List nums) {
// 在区间[0,size) 中随机抽取一个数字
// 在区间 [0, nums.length) 中随机抽取一个数字
int randomIndex = Random().nextInt(nums.length);
// 获取并返回随机元素
int randomNum = nums[randomIndex];
Expand All @@ -17,9 +17,8 @@ int randomAccess(List nums) {

/* 扩展数组长度 */
List extend(List nums, int enlarge) {
// 初始化一个扩展长度后的数组,元素初始值为0
// 初始化一个扩展长度后的数组
List<int> res = List.filled(nums.length + enlarge, 0);

// 将原数组中的所有元素复制到新数组
for (var i = 0; i < nums.length; i++) {
res[i] = nums[i];
Expand All @@ -30,7 +29,7 @@ List extend(List nums, int enlarge) {

/* 在数组的索引 index 处插入元素 num */
void insert(List nums, int num, int index) {
// 把索引index以及之后的所有元素向后移动一位
// 把索引 index 以及之后的所有元素向后移动一位
for (var i = nums.length - 1; i > index; i--) {
nums[i] = nums[i - 1];
}
Expand All @@ -40,6 +39,7 @@ void insert(List nums, int num, int index) {

/* 删除索引 index 处元素 */
void remove(List nums, int index) {
// 把索引 index 之后的所有元素向前移动一位
for (var i = index; i < nums.length - 1; i++) {
nums[i] = nums[i + 1];
}
Expand All @@ -56,7 +56,7 @@ void traverse(List nums) {
for (var num in nums) {
count++;
}
// 通过forEach方法遍历数组
// 通过 forEach 方法遍历数组
nums.forEach((element) {
count++;
});
Expand All @@ -71,8 +71,8 @@ int find(List nums, int target) {
}

/* Driver Code */
int main() {
/* 初始化固定长度数组 */
void main() {
/* 初始化数组 */
var arr = List.filled(5, 0);
print('数组 arr = $arr');
List nums = [1, 3, 2, 5, 4];
Expand Down Expand Up @@ -100,6 +100,4 @@ int main() {
/* 查找元素 */
int index = find(nums, 3);
print("在 nums 中查找元素 3 ,得到索引 = $index");

return 0;
}
7 changes: 3 additions & 4 deletions codes/dart/chapter_array_and_linkedlist/linked_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ void insert(ListNode n0, ListNode P) {
/* 删除链表的节点 n0 之后的首个节点 */
void remove(ListNode n0) {
if (n0.next == null) return;
// n0 -> P -> n1
ListNode P = n0.next!;
ListNode? n1 = P.next;
n0.next = n1;
Expand Down Expand Up @@ -45,9 +46,9 @@ int find(ListNode? head, int target) {
}

/* Driver Code */
int main() {
void main() {
// 初始化链表
//初始化各个节点
// 初始化各个节点
ListNode n0 = ListNode(1);
ListNode n1 = ListNode(3);
ListNode n2 = ListNode(2);
Expand Down Expand Up @@ -79,6 +80,4 @@ int main() {
/* 查找节点 */
int index = find(n0, 2);
print('链表中值为 2 的节点的索引 = $index');

return 0;
}
4 changes: 1 addition & 3 deletions codes/dart/chapter_array_and_linkedlist/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

/* Driver Code */
int main() {
void main() {
/* 初始化列表 */
List<int> list = [1, 3, 2, 5, 4];
print('列表 list = $list');
Expand Down Expand Up @@ -57,6 +57,4 @@ int main() {
/* 排序列表 */
list.sort();
print('排序列表后 list = $list');

return 0;
}
4 changes: 1 addition & 3 deletions codes/dart/chapter_array_and_linkedlist/my_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class MyList {
}

/* Driver Code */
int main() {
void main() {
/* 初始化列表 */
MyList list = MyList();
/* 尾部添加元素 */
Expand Down Expand Up @@ -129,6 +129,4 @@ int main() {
}
print(
'扩容后的列表 list = ${list.toArray()} ,容量 = ${list.capacity()} ,长度 = ${list.size()}');

return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ TreeNode? buildTree(int n) {
}

/* Driver Code */
int main() {
void main() {
int n = 5;
// 常数阶
constant(n);
Expand All @@ -102,5 +102,4 @@ int main() {
// 指数阶
TreeNode? root = buildTree(n);
printTree(root);
return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ int bubbleSort(List<int> nums) {
int count = 0; // 计数器
// 外循环:未排序区间为 [0, i]
for (var i = nums.length - 1; i > 0; i--) {
// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端
for (var j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
// 交换 nums[j] 与 nums[j + 1]
Expand Down Expand Up @@ -122,7 +122,7 @@ int factorialRecur(int n) {
}

/* Driver Code */
int main() {
void main() {
// 可以修改 n 运行,体会一下各种复杂度的操作数量变化趋势
int n = 8;
print('输入数据大小 n = $n');
Expand Down Expand Up @@ -160,5 +160,4 @@ int main() {

count = factorialRecur(n);
print('阶乘阶(递归实现)的计算操作数量 = $count');
return 0;
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,12 @@ int findOne(List<int> nums) {
}

/* Driver Code */
int main() {
void main() {
for (var i = 0; i < 10; i++) {
int n = 100;
final nums = randomNumbers(n);
int index = findOne(nums);
print('\n数组 [ 1, 2, ..., n ] 被打乱后 = $nums');
print('数字 1 的索引为 + $index');
}

return 0;
}
3 changes: 2 additions & 1 deletion codes/dart/chapter_hashing/hash_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ void main() {
print("\n遍历键值对 Key->Value");
map.forEach((key, value) => print("$key -> $value"));
print("\n单独遍历键 Key");
map.forEach((key, value) => print("$key"));
map.keys.forEach((key) => print(key));
print("\n单独遍历值 Value");
map.forEach((key, value) => print("$value"));
map.values.forEach((value) => print(value));
}
1 change: 0 additions & 1 deletion codes/dart/chapter_stack_and_queue/deque.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ void main() {
print("元素 1 队首入队后 deque = $deque");

/* 元素出队 */

final int popLast = deque.removeLast();
print("队尾出队元素 = $popLast,队尾出队后 deque = $deque");
final int popFirst = deque.removeFirst();
Expand Down
4 changes: 3 additions & 1 deletion docs/chapter_array_and_linkedlist/array.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@
=== "Dart"

```dart title="array.dart"

/* 初始化数组 */
List<int> arr = List.filled(5, 0); // [0, 0, 0, 0, 0]
List<int> nums = [1, 3, 2, 5, 4];
```

## 数组优点
Expand Down
28 changes: 25 additions & 3 deletions docs/chapter_array_and_linkedlist/linked_list.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,12 @@
=== "Dart"

```dart title=""

/* 链表节点类 */
class ListNode {
int val; // 节点值
ListNode? next; // 指向下一节点的指针(引用)
ListNode(this.val, [this.next]); // 构造函数
}
```

!!! question "尾节点指向什么?"
Expand Down Expand Up @@ -342,7 +347,18 @@
=== "Dart"

```dart title="linked_list.dart"

/* 初始化链表 1 -> 3 -> 2 -> 5 -> 4 */\
// 初始化各个节点
ListNode n0 = ListNode(1);
ListNode n1 = ListNode(3);
ListNode n2 = ListNode(2);
ListNode n3 = ListNode(5);
ListNode n4 = ListNode(4);
// 构建引用指向
n0.next = n1;
n1.next = n2;
n2.next = n3;
n3.next = n4;
```

## 链表优点
Expand Down Expand Up @@ -799,7 +815,13 @@
=== "Dart"

```dart title=""

/* 双向链表节点类 */
class ListNode {
int val; // 节点值
ListNode next; // 指向后继节点的指针(引用)
ListNode prev; // 指向前驱节点的指针(引用)
ListNode(this.val, [this.next, this.prev]); // 构造函数
}
```

![常见链表种类](linked_list.assets/linkedlist_common_types.png)
41 changes: 38 additions & 3 deletions docs/chapter_array_and_linkedlist/list.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,11 @@
=== "Dart"

```dart title="list.dart"

/* 初始化列表 */
// 无初始值
List<int> list1 = [];
// 有初始值
List<int> list = [1, 3, 2, 5, 4];
```

**访问与更新元素**。由于列表的底层数据结构是数组,因此可以在 $O(1)$ 时间内访问和更新元素,效率很高。
Expand Down Expand Up @@ -213,7 +217,11 @@
=== "Dart"

```dart title="list.dart"
/* 访问元素 */
int num = list[1]; // 访问索引 1 处的元素

/* 更新元素 */
list[1] = 0; // 将索引 1 处的元素更新为 0
```

**在列表中添加、插入、删除元素**。相较于数组,列表可以自由地添加与删除元素。在列表尾部添加元素的时间复杂度为 $O(1)$ ,但插入和删除元素的效率仍与数组相同,时间复杂度为 $O(N)$ 。
Expand Down Expand Up @@ -407,7 +415,21 @@
=== "Dart"

```dart title="list.dart"
/* 清空列表 */
list.clear();

/* 尾部添加元素 */
list.add(1);
list.add(3);
list.add(2);
list.add(5);
list.add(4);

/* 中间插入元素 */
list.insert(3, 6); // 在索引 3 处插入数字 6

/* 删除元素 */
list.removeAt(3); // 删除索引 3 处的元素
```

**遍历列表**。与数组一样,列表可以根据索引遍历,也可以直接遍历各元素。
Expand Down Expand Up @@ -566,7 +588,17 @@
=== "Dart"

```dart title="list.dart"
/* 通过索引遍历列表 */
int count = 0;
for (int i = 0; i < list.length; i++) {
count++;
}

/* 直接遍历列表元素 */
count = 0;
for (int n in list) {
count++;
}
```

**拼接两个列表**。给定一个新列表 `list1` ,我们可以将该列表拼接到原列表的尾部。
Expand Down Expand Up @@ -655,7 +687,9 @@
=== "Dart"

```dart title="list.dart"

/* 拼接两个列表 */
List<int> list1 = [6, 8, 7, 10, 9];
list.addAll(list1); // 将列表 list1 拼接到 list 之后
```

**排序列表**。排序也是常用的方法之一。完成列表排序后,我们便可以使用在数组类算法题中经常考察的「二分查找」和「双指针」算法。
Expand Down Expand Up @@ -732,7 +766,8 @@
=== "Dart"

```dart title="list.dart"

/* 排序列表 */
list.sort(); // 排序后,列表元素从小到大排列
```

## 列表实现 *
Expand Down
21 changes: 20 additions & 1 deletion docs/chapter_backtracking/backtracking_algorithm.md
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,26 @@
=== "Dart"

```dart title=""

/* 回溯算法框架 */
void backtrack(State state, List<Choice>, List<State> res) {
// 判断是否为解
if (isSolution(state)) {
// 记录解
recordSolution(state, res);
return;
}
// 遍历所有选择
for (Choice choice in choices) {
// 剪枝:判断选择是否合法
if (isValid(state, choice)) {
// 尝试:做出选择,更新状态
makeChoice(state, choice);
backtrack(state, choices, res);
// 回退:撤销选择,恢复到之前的状态
undoChoice(state, choice);
}
}
}
```

下面,我们尝试基于此框架来解决例题三。在例题三中,状态 `state` 是节点遍历路径,选择 `choices` 是当前节点的左子节点和右子节点,结果 `res` 是路径列表,实现代码如下所示。
Expand Down
Loading

0 comments on commit 281c0c6

Please sign in to comment.