Skip to content

Commit 7594c5c

Browse files
author
luzhipeng
committed
feat: 每日一题 2019-07-26
1 parent c822de9 commit 7594c5c

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

Diff for: assets/daily/2019-07-26.jpeg

657 KB
Loading

Diff for: daily/2019-07-26.md

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# 毎日一题 - 将帅问题
2+
3+
## 信息卡片
4+
5+
- 时间:2019-07-26
6+
- 题目链接:无(来自编程之美)
7+
- tag:`数据压缩`
8+
9+
## 题目描述
10+
11+
![2019-07-26](../assets/daily/2019-07-26.jpeg)
12+
13+
## 参考答案
14+
15+
这是数据压缩问题中的一种。
16+
17+
类似的问题有, 如果将 IP 地址用 4 个字节来表示等等。
18+
19+
这道题的思路,如果我们不考虑用一个字节去存储的话,我们通过观察
20+
坐标,发现“坐标和 3 取余的结果相同的就是同一列”,因此我们可以根据
21+
这个来判断位置是否合法。
22+
23+
我们容易写出类似下面的代码:
24+
25+
```js
26+
for (let i = 0; i < 9; i++) {
27+
for (let j = 0; j < 9; j++) {
28+
if (i % 3 !== j % 3) {
29+
console.log(`${i + 1}, ${j + 1}`);
30+
}
31+
}
32+
}
33+
```
34+
35+
可以看出上面的写法用到了两个字节去表示,如何将上面的写法压缩到一个字节呢?
36+
37+
仔细观察我们发现,内存循环和外层循环的长度是一样的,
38+
其实我们内外循环用一个变量表示。
39+
40+
41+
内外循环总共执行了81次。 我们定义一个变量为81.
42+
然后用i / 9 来表示外层循环的值。 用 i % 9 来表示内层循环的值。
43+
44+
可以看出,i增加9次之后,内存循环会增加9,外层增加1,整个过程类似上面。
45+
46+
代码如下:
47+
48+
```js
49+
let i = 81;
50+
51+
while (i-- > 0) {
52+
if (((i / 9) >> 0) % 3 !== (i % 9) % 3) {
53+
console.log(`${((i / 9) >> 0) + 1}, ${(i % 9) + 1}`);
54+
}
55+
}
56+
```
57+
58+
## 优秀解答
59+
60+
> 暂缺

Diff for: daily/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,9 @@ tag:`Linked List`
143143
tag:`发散思维`
144144

145145
时间: 2019-07-24
146+
147+
### [将帅问题](./2019-07-26.md)
148+
149+
tag:`数据压缩`
150+
151+
时间: 2019-07-26

0 commit comments

Comments
 (0)