Skip to content

Commit ffc0bc9

Browse files
committed
docs: update algorithm-stories.md
1 parent 0f0ab66 commit ffc0bc9

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

_navbar.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* 笔记
66
* [代码整洁之道](docs/clean-code.md)
77
* [阿里巴巴 Java 开发手册](docs/effective-coding.md)
8+
* [枕边算法书](docs/algorithm-stories.md)
89

910
* 页面
1011
* [封面]()

docs/algorithm-stories.md

+28-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
> 这里仅挑一些有意思的故事或知识点做个记录。
44
55
- [“红色眼睛与褐色眼睛”谜题](#红色眼睛与褐色眼睛谜题)
6+
- [找出剩下的一个数](#找出剩下的一个数)
67

78
## “红色眼睛与褐色眼睛”谜题
89
从前,有个小岛上只住着和尚。有些和尚的眼睛是红色的,而另一些则是褐色的。红色眼睛的和尚受到诅咒,如果得知自己的眼睛是红色的,那么当晚 12 点必须自行了断,无一例外。
910

10-
和尚间有一条不成文的规定,就是彼此不能提起对方眼睛的颜色。小岛上没有一面镜子,也没有可以反射自己容貌的物体。因此,没有任何人能够得知自己眼睛的颜色。出于这些原因,每个和尚都过着幸福的日子。
11+
和尚间有一条不成文的规定,就是彼此不能提起对方眼睛的颜色。小岛上没有一面镜子,也没有任何可以反射自己容貌的物体。因此,没有任何一个和尚能够得知自己眼睛的颜色。出于这些原因,每个和尚都过着幸福的日子。
1112

1213
有一天,岛上突然来了一位游客,她完全处于状况外。于是,她对和尚们说:“你们当中至少有一位的眼睛是红色的”。
1314

@@ -17,6 +18,14 @@
1718

1819
这道题不简单却非常有意思,而一旦知道答案,又会觉得并不太难。这并非是那种荒谬的问题,要想解开需要一些逻辑推理,所以不要试图一下子解开。先花 2 分钟时间独立思考一下吧。
1920

21+
```
22+
if ((思考时间 > 2 分钟) || (已经知道答案了吗)) {
23+
跳转至下一段
24+
} else {
25+
返回上一段,并至少思考 2 分钟
26+
}
27+
```
28+
2029
下面开始查看正确答案。
2130

2231
游客说,“至少有一个人”的眼睛是红色的。假如这岛上**没有任何一个和尚的眼睛是红色的**,那么这会导致最糟糕的结果。你想一想,对于和尚们来说,除了自己以外,看到的其它和尚的眼睛都是褐色的。因此,每个和尚都会认为自己的眼睛是红色的,可想而知,所有和尚当晚都会自杀。
@@ -29,4 +38,21 @@
2938

3039
这种逻辑会反复循环。因此,该题的答案是“若小岛上共有 n 个红眼和尚,那么第 n 个晚上这些和尚会同时自杀”。离入,小当时共有 5 个红眼和尚,那么第 5 个晚上,这 5 个红眼和尚会同时自杀。
3140

32-
这道题其实可以利用递归的方法。假设红眼和尚人数 N 为 10,那么我们可以适用 N 为 9 的逻辑。同理,N 为 8 或 7 时,都适用 `N-1` 时的逻辑。将 `N=1`,即“只有一个红眼和尚”视为终止条件,即可得出最终结果。这种过程与计算机算法中函数的递归调用过程完全相同或给。
41+
这道题其实可以利用递归的方法。假设红眼和尚人数 N 为 10,那么我们可以适用 N 为 9 的逻辑。同理,N 为 8 或 7 时,都适用 `N-1` 时的逻辑。将 `N=1`,即“只有一个红眼和尚”视为终止条件,即可得出最终结果。这种过程与计算机算法中函数的递归调用过程完全相同或给。
42+
43+
## 找出剩下的一个数
44+
有一个能保存 99 个数值的数组 `item[0], item[1],...item[98]`。从拥有 `1~100` 元素的集合 {1,2,3,...,100} 中,随机抽取 99 个元素保存到数组。集合中共有 100 个元素,而数组只能保存 99 个数值,所以集合中会剩下一个元素。编写程序,找出最后剩下的数。
45+
46+
还是先花 2 分钟想一想吧。
47+
48+
好了,这个问题其实非常简单,但没能正确理解提议的读者可能认为很难。答案如下代码所示。
49+
50+
```java
51+
int res = 5050;
52+
for (int i = 0; i < 100; ++i) {
53+
res -= item[i];
54+
}
55+
System.out.println("最后剩下的数是:" + res);
56+
```
57+
58+
如果将集合的 100 个数值累加,会得到 5050。依次从 5050 减去数组中的 99 个数值,最后的数就是没能保存到数组的那个剩余数值。也许很多读者想到了与此相近的算法。即使没有得到正确答案也不用失望,因为真正应该感到失望的人是那些没能找到答案后轻易选择放弃、想要直接查看正确答案的人。

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang="en">
33
<head>
44
<meta charset="UTF-8">
5-
<title>代码面试题集</title>
5+
<title>技术类知识仓库</title>
66
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
77
<meta name="description" content="coding-interview">
88
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

0 commit comments

Comments
 (0)