Skip to content

Commit 7e44ce3

Browse files
author
haoyang.shi
committed
add
1 parent 35bb1f8 commit 7e44ce3

3 files changed

Lines changed: 91 additions & 1 deletion

File tree

SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
- [二进制中1的个数](offer/number-of-one.md)
133133
- [数值的整数次方](offer/power.md)
134134
- [打印最大的 n 位数](offer/printn.md)
135-
- [在O(1)的时间复杂度下删除节点](offer/o1DeleteNode.md)
135+
- [在O(1)的时间复杂度下删除节点](offer/O1DeleteNode.md)
136136
- [调整数组顺序使奇数位于偶数前面](offer/reOrderArray.md)
137137
- [链表中倒数第k个结点](offer/FindKthToTail.md)
138138
- [反转链表](offer/revert-link.md)

offer/O1DeleteNode.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,35 @@
11
# 在O(1)的时间复杂度下删除节点
2+
3+
## 题目
4+
5+
给定单向链表的头指针以及待删除的指针,定义一个函数在 O(1) 的时间复杂度下删除
6+
7+
## 解题思路
8+
9+
1. 待删除节点非尾节点,将后一个节点的值复制到当前节点,然后删除后一个节点
10+
2. 待删除节点为尾节点,从头节点开始,找到待删除节点的前一个节点进行删除
11+
12+
```
13+
public void O1DeleteNode(ListNode head, ListNode needDelete) {
14+
15+
if (needDelete.next != null) {
16+
ListNode next = needDelete.next.next;
17+
needDelete.val = needDelete.next.val;
18+
needDelete.next = next;
19+
20+
} else {
21+
ListNode cursor = head;
22+
23+
while (cursor != null) {
24+
if (cursor.next == needDelete) break;
25+
26+
cursor = cursor.next;
27+
}
28+
29+
if (cursor == null) return;
30+
31+
cursor.next = needDelete.next;
32+
}
33+
34+
}
35+
```

offer/SumOfNDice.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,57 @@
11
# n个骰子的点数
2+
3+
## 题目
4+
5+
把 n 个骰子扔在地上,所有骰子朝上一面的和为 s,输入 n,打印 s 所有可能值的概率
6+
7+
## 解题思路
8+
9+
1. 首先考虑一个骰子的情况,那么有 1~6 出现的次数均为 1
10+
2. 再增加一个骰子时,由于各个点数出现的概率一致。用 $f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6)$
11+
3. 使用两个数组循环求解
12+
13+
```
14+
public void SumOfNDice(int n) {
15+
if (n < 1) {
16+
return;
17+
}
18+
19+
int[][] nums = new int[2][n * 6 + 1];
20+
21+
int flag = 0;
22+
23+
//初始化第一个骰子各总和出现的次数
24+
int maxLen = nums[0].length;
25+
for (int i = 1; i < maxLen; i++) {
26+
nums[flag][i] = 1;
27+
}
28+
29+
for (int i = 2; i <= n; i++) {
30+
int newFlag = flag ^ 0x01;
31+
Arrays.fill(nums[newFlag], 0);
32+
33+
for (int j = i; j < maxLen; j++) {
34+
int sum = 0;
35+
36+
for (int k = 1; k <= 6 && (j - k >= 0); k++) {
37+
sum += nums[flag][j - k];
38+
}
39+
40+
nums[newFlag][j] = sum;
41+
}
42+
flag = newFlag;
43+
}
44+
45+
//debug out
46+
System.out.println(Arrays.toString(nums[flag]));
47+
48+
int sum = 0;
49+
for (int i : nums[flag]) {
50+
sum += i;
51+
}
52+
53+
for (int i = 0; i < nums[flag].length; i++) {
54+
System.out.println(i + ":" + nums[flag][i] * 1.0 / sum);
55+
}
56+
}
57+
```

0 commit comments

Comments
 (0)