Skip to content

[pull] master from geekxh:master #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 192 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
192 commits
Select commit Hold shift + click to select a range
de014fc
update .gitignore
geekxh Aug 2, 2020
a9c88c8
refactor
geekxh Aug 2, 2020
98e0ec5
Bump elliptic from 6.5.2 to 6.5.3
dependabot[bot] Aug 2, 2020
e3948fa
Merge pull request #13 from geekxh/dependabot/npm_and_yarn/elliptic-6…
geekxh Aug 2, 2020
4777457
update README.md
Aug 3, 2020
40ca657
Update README.md
geekxh Aug 3, 2020
422f412
update README.md
Aug 3, 2020
3bd237c
update README.md
Aug 3, 2020
aeb1e02
修正环形链表题目对应的 leetcode 题号
Aug 4, 2020
eda38cc
update README.md
Aug 5, 2020
3612d4a
Merge pull request #17 from zyphs21/master
geekxh Aug 5, 2020
8070abb
Update README.md
geekxh Aug 5, 2020
7b56223
Merge pull request #18 from geekxh/feature/test
geekxh Aug 5, 2020
1a49dee
Update Python 电子书 100 本.md
ixysoft Aug 11, 2020
8686675
Merge pull request #21 from ixysoft/patch-1
geekxh Aug 13, 2020
d453e2b
update README.md
Aug 14, 2020
4a0dcae
upgrade valine version
Aug 14, 2020
c8731d8
Bump prismjs from 1.20.0 to 1.21.0
dependabot[bot] Aug 14, 2020
791f828
Merge pull request #24 from geekxh/dependabot/npm_and_yarn/prismjs-1.…
geekxh Aug 16, 2020
49aa869
update
Aug 17, 2020
e599e5a
init `剑指offer`
Aug 17, 2020
a8aa49d
update
Aug 17, 2020
604fda7
update README
Aug 17, 2020
ce774cc
Merge pull request #25 from geekxh/feature/0817_refactor
geekxh Aug 17, 2020
268cf9b
refactor project
Aug 17, 2020
7810057
update README.md
Aug 17, 2020
7381fb0
Merge branch 'master' of github.com:geekxh/hello-algorithm
Aug 17, 2020
795c288
Merge pull request #26 from geekxh/feature/0817_refactor
geekxh Aug 17, 2020
bf80d53
update
Aug 17, 2020
bb09b8c
update README
Aug 17, 2020
8505098
Merge pull request #27 from geekxh/feature_0818
geekxh Aug 17, 2020
563fba6
调整目录名称
Aug 17, 2020
52010b0
add pwd.jpg
Aug 17, 2020
850a99a
add test
Aug 17, 2020
3e01513
Delete .DS_Store
geekxh Aug 17, 2020
83efeec
Delete .DS_Store
geekxh Aug 17, 2020
3cb57aa
Delete .DS_Store
geekxh Aug 17, 2020
925909c
Delete .DS_Store
geekxh Aug 17, 2020
1ef4daa
Delete .DS_Store
geekxh Aug 17, 2020
44f4186
Delete .DS_Store
geekxh Aug 17, 2020
c804301
Delete .DS_Store
geekxh Aug 17, 2020
aa142d0
Delete .DS_Store
geekxh Aug 17, 2020
8a6f125
Delete .DS_Store
geekxh Aug 17, 2020
5c843f9
Delete .DS_Store
geekxh Aug 17, 2020
cb5020e
Delete .DS_Store
geekxh Aug 17, 2020
77fa911
Delete .DS_Store
geekxh Aug 17, 2020
2497eed
Delete .DS_Store
geekxh Aug 17, 2020
53e8eac
调整内容
Aug 17, 2020
64d7c59
更新下载链接
Aug 17, 2020
a116a1b
调整下载地址
Aug 17, 2020
5986096
update README
Aug 17, 2020
5983981
update README
Aug 17, 2020
c703bde
Update README.md
geekxh Aug 18, 2020
cd3f549
Update README.md
geekxh Aug 18, 2020
739d8db
Merge pull request #28 from geekxh/feature/0818
geekxh Aug 18, 2020
1a2b1de
Update README.md
geekxh Aug 18, 2020
156d093
Update README.md
geekxh Aug 18, 2020
27be2b4
Update README.md
geekxh Aug 18, 2020
ff6455a
Merge pull request #29 from geekxh/geekxh-patch-1
geekxh Aug 18, 2020
8e93194
Update README.md
geekxh Aug 20, 2020
b53db41
Update README.md
geekxh Aug 20, 2020
0b17de1
english version
Aug 20, 2020
8b89ede
更新目录结构
Aug 20, 2020
cfcec22
update README.md
Aug 20, 2020
e45613a
update README.md
Aug 20, 2020
b69cc5f
update README.md
Aug 20, 2020
26092a4
调整内容
Aug 20, 2020
4ac9e33
中文书籍1000本
Aug 20, 2020
3d1fd7d
调整目录
Aug 20, 2020
630fbed
调整目录
Aug 20, 2020
9dc76f0
Update README.md
geekxh Aug 20, 2020
0a16bff
Update README.md
geekxh Aug 20, 2020
b83186a
Update README.md
geekxh Aug 20, 2020
dd4f415
Update README.md
geekxh Aug 20, 2020
cbe33c2
init 设计模式
Aug 24, 2020
67c9290
new content
Aug 24, 2020
5c9d254
Update README.md
geekxh Aug 24, 2020
10636bb
Update README.md
geekxh Aug 24, 2020
6715f6f
Update README.md
geekxh Aug 24, 2020
d7f4982
新增mysql相关内容
Aug 24, 2020
d036652
Merge branch 'master' of github.com:geekxh/hello-algorithm
Aug 24, 2020
79db68e
Update README.md
geekxh Aug 24, 2020
b663cf7
update
Aug 24, 2020
39e3f98
Merge branch 'master' of github.com:geekxh/hello-algorithm
Aug 24, 2020
56f9f83
update
Aug 24, 2020
9a64ab7
Fix: put the process in the background
Aug 25, 2020
7719870
update README
Aug 26, 2020
c92d440
update README
Aug 26, 2020
6ca5e6e
update README
Aug 26, 2020
fe39493
update README
Aug 26, 2020
ba2263b
Update README.md
geekxh Aug 26, 2020
3f77165
删除多余的文件
Aug 26, 2020
4153f77
Merge pull request #34 from StevenHugo/master
geekxh Aug 27, 2020
9896f9f
Update README.md
geekxh Sep 13, 2020
42b3222
Update README.md
geekxh Sep 14, 2020
dcede8a
Update README.md
geekxh Sep 14, 2020
20d5abe
Update README.md
geekxh Sep 14, 2020
2c3d931
Update README.md
geekxh Sep 14, 2020
3ce1ce4
Update README.md
geekxh Sep 14, 2020
3684fc1
Update README.md
geekxh Sep 14, 2020
2374a2f
Update README.md
geekxh Sep 14, 2020
678c8ee
Update README.md
geekxh Sep 14, 2020
a939caa
Update README.md
geekxh Sep 14, 2020
10e7d5e
Update README.md
geekxh Sep 14, 2020
76e6249
Update README.md
geekxh Sep 14, 2020
0961c6c
Update README.md
geekxh Sep 14, 2020
86cf4a3
Update README.md
geekxh Sep 14, 2020
756c1a4
Update README.md
geekxh Sep 14, 2020
4ed651a
Update README.md
geekxh Sep 14, 2020
35a9a87
Update README.md
geekxh Sep 14, 2020
d5e5d47
Update README.md
geekxh Sep 14, 2020
5b10fea
Merge pull request #42 from geekxh/geekxh-patch-1
geekxh Sep 14, 2020
40d10f6
refactor - 1025
Oct 25, 2020
1b56cbf
update README.md
geekxh Nov 9, 2020
02830da
update README.md
geekxh Nov 9, 2020
3a70b08
update README.md
geekxh Nov 9, 2020
3040be4
update README.md
geekxh Nov 9, 2020
74cefc0
update README.md
geekxh Nov 9, 2020
be17e81
update README.md
geekxh Nov 9, 2020
6f825cc
update README.md
Nov 10, 2020
cb5e925
`update README.md`
Nov 13, 2020
203b1ad
update README.md
Nov 13, 2020
cb1eb1f
update README.md
Nov 13, 2020
ab1e0d8
update README.md
geekxh Nov 14, 2020
3ff98fa
refactor
geekxh Nov 14, 2020
e85db19
update
geekxh Nov 15, 2020
0fd9415
update
geekxh Nov 15, 2020
9a43e90
Update README.md
geekxh Nov 15, 2020
0e88338
Delete .DS_Store
geekxh Nov 16, 2020
5da82da
Merge branch 'master' into feature/1026
geekxh Nov 16, 2020
068cf3d
Merge pull request #48 from geekxh/feature/1026
geekxh Nov 16, 2020
852c96a
Update README.md
geekxh Nov 16, 2020
3d82c32
update README.md
Nov 16, 2020
28204da
Merge pull request #49 from geekxh/feature/1116
geekxh Nov 16, 2020
c20d0c1
Update README.md
geekxh Nov 16, 2020
8aed006
update README.md
Nov 18, 2020
ddf39a9
Update README.md
geekxh Nov 18, 2020
92c774e
update README.md
Nov 20, 2020
d0932c2
Update README.md
geekxh Nov 20, 2020
5036df0
Merge pull request #50 from geekxh/feature/1118
geekxh Nov 20, 2020
caa12b4
Update README.md
geekxh Nov 20, 2020
082c8b3
Update README.md
geekxh Nov 20, 2020
ed51fdb
Update README.md
geekxh Nov 20, 2020
ef074c4
update README.md
Nov 20, 2020
7ab3cfe
Update README.md
geekxh Mar 28, 2021
7f0ebd2
Update README.md
geekxh Mar 28, 2021
edff276
Update README.md
geekxh Mar 28, 2021
93ea281
Update README.md
geekxh Mar 28, 2021
3ccf291
Update README.md
geekxh Mar 28, 2021
9608dfa
Merge pull request #58 from geekxh/geekxh-patch-1
geekxh Mar 28, 2021
258277f
Update README.md
geekxh Apr 7, 2021
55e2e61
Update README.md
geekxh Jun 18, 2021
ffd1253
Update README.md
geekxh Jun 23, 2021
512af4a
Merge branch 'master' of https://github.com/geekxh/hello-algorithm in…
Jul 20, 2021
47cb829
'重构项目'
Jul 26, 2021
7fde2d9
'重构项目'
Jul 26, 2021
c877b5c
'调整目录'
Jul 26, 2021
84f7d7b
'调整内容'
Jul 26, 2021
1c09ad4
add:算法基础内容导航
Jul 26, 2021
00af3c3
调整目录
geekxh Jul 26, 2021
aba49c4
alter
geekxh Jul 26, 2021
a4feb34
alter
geekxh Jul 26, 2021
670c054
alter
geekxh Jul 26, 2021
74192b8
'更新'
geekxh Jul 26, 2021
224f404
'update'
geekxh Jul 27, 2021
dc6311c
Update README.md
geekxh Jul 27, 2021
c54e0cb
Update README.md
geekxh Jul 27, 2021
cd926d0
Update README.md
geekxh Jul 27, 2021
a5fe90c
Update README.md
geekxh Jul 27, 2021
878ffbc
Update README.md
geekxh Jul 27, 2021
8fec437
Merge pull request #62 from geekxh/feature/0726
geekxh Jul 27, 2021
052b8ef
Update README.md
geekxh Jul 27, 2021
b300ac2
Update README.md
geekxh Jul 27, 2021
3e4df2c
Update README.md
geekxh Oct 11, 2021
3d44d2f
Update README.md
geekxh Feb 9, 2022
aa5c6a2
Merge pull request #68 from geekxh/geekxh-patch-1
geekxh Feb 14, 2022
94d1308
Update README.md
geekxh Jul 15, 2022
5f52763
Update README.md
geekxh Jul 29, 2022
c0074b2
Update README.md
geekxh Aug 1, 2022
0ee841e
Merge pull request #72 from geekxh/geekxh-patch-1
geekxh Aug 1, 2022
60cf6ec
Update README.md
geekxh Aug 1, 2022
677cdf5
Update README.md
geekxh Aug 8, 2022
5e1bacd
Update README.md
geekxh May 7, 2023
51789c3
Merge pull request #75 from geekxh/geekxh-patch-2
geekxh May 7, 2023
9583147
Update README.md
geekxh May 16, 2023
132ef1b
Update README.md
geekxh May 16, 2023
dee3507
Update README.md
geekxh May 18, 2023
fbe9675
Update README.md
geekxh May 19, 2023
75a8fee
Update README.md
geekxh May 29, 2023
ccb19fc
Update README.md
geekxh Jun 13, 2023
a3157d3
Update README.md
geekxh Jun 13, 2023
60a2b5f
Update README.md
geekxh Jun 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Prev Previous commit
Next Next commit
'重构项目'
  • Loading branch information
haolin3 committed Jul 26, 2021
commit 47cb829b4345fb8cec7a1e3c002c8c667840c92c
679 changes: 679 additions & 0 deletions PART_1_算法基础知识/数据结构知识框架/README.md

Large diffs are not rendered by default.

Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@ date: 2020-06-14

在leetcode中,直接搜索**排序标签**出现的题目有80余道,这是与排序直接相关的题目,不包括其他一些用到排序思想的题目。

<img src="./701/1.jpg" alt="PNG" style="zoom:67%;" />
<img src="701/1.jpg" alt="PNG" style="zoom:67%;" />

同时,各个公司在面试的过程中,或多或少都直接或间接问到过排序相关的内容(毕竟面试官不知道问什么时,都会用排序算法来救救场。不要问我是怎么知道的...),尤其是 **快排、堆排序、全排列** 等 Topic,在面试中屡试不爽。

<br/>

<center><b> 百度:堆排序 </b></center>
<img src="./701/2.jpg" alt="PNG" style="zoom:67%;" />
<img src="701/2.jpg" alt="PNG" style="zoom:67%;" />

<center><b> 滴滴:全排列 </b></center>
<img src="./701/3.jpg" alt="PNG" style="zoom:67%;" />
<img src="701/3.jpg" alt="PNG" style="zoom:67%;" />

综上,得出结论**:为了offer~排序很重要,我们需要进行掌握。**

Expand All @@ -31,7 +31,7 @@ date: 2020-06-14

插入排序:就是炸金花的时候,你**接一个同花顺**的过程。(标准定义:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的)

<img src="./701/4.gif" alt="PNG" style="zoom:67%;" />
<img src="701/4.gif" alt="PNG" style="zoom:67%;" />

代码示例:

Expand All @@ -54,7 +54,7 @@ func insert_sort(arr []int) {    

输入:

<img src="./701/5.jpg" alt="PNG" />
<img src="701/5.jpg" alt="PNG" />

讲解完了插入排序,我们根据其思想,完成下面这道题目吧

Expand Down Expand Up @@ -87,7 +87,7 @@ func insert_sort(arr []int) {    

假设我们的数组为:[3,1,2,4]

<img src="./701/6.jpg" alt="PNG" />
<img src="701/6.jpg" alt="PNG" />

根据以上分析,得到代码:

Expand All @@ -106,5 +106,5 @@ func sortArrayByParity(A []int) []int {

执行结果:

<img src="./701/7.jpg" alt="PNG" style="zoom:80%;" />
<img src="701/7.jpg" alt="PNG" style="zoom:80%;" />

Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ class Solution {

利用这一特性,我们**将递归的返回条件取非然后作为 && 的第一个条件,递归主体转换为第二个条件语句**。我知道肯定有人又会懵圈了,所以我们绘图说明。假若这里n=3,大概就是下面这样:

<img src="./801/1.jpg" alt="PNG" style="zoom: 67%;" />
<img src="801/1.jpg" alt="PNG" style="zoom: 67%;" />

这里还有一点要强调的就是,受制于各语言的语法规则,我们需要做一些额外的处理。比如Java,这里如果去掉前面的变量申明,就会直接报错。

<img src="./801/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="801/2.jpg" alt="PNG" style="zoom: 80%;" />

但是如果是C 就没有这样的问题:

Expand Down Expand Up @@ -121,4 +121,4 @@ func sumNums(n int) int {

执行结果:

<img src="./801/3.jpg" alt="PNG" style="zoom: 80%;" />
<img src="801/3.jpg" alt="PNG" style="zoom: 80%;" />
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@ date: 2020-06-21

先观察一些是2的幂的二进制数:

<img src="./802/1.jpg" alt="PNG" style="zoom: 50%;" />
<img src="802/1.jpg" alt="PNG" style="zoom: 50%;" />

**可以发现这些数,都是最高位为1,其他位为0**。所以我们把问题转化为“判断一个数的二进制,除了最高位为1,是否还有别的1存在”。然后我们再观察下面这样的一组数,对应着上面的数减去1:

<img src="./802/2.jpg" alt="PNG" style="zoom: 50%;" />
<img src="802/2.jpg" alt="PNG" style="zoom: 50%;" />

我们对两组数求“&”运算:

<img src="./802/3.jpg" alt="PNG" style="zoom: 67%;" />
<img src="802/3.jpg" alt="PNG" style="zoom: 67%;" />

可以看到,对于N为2的幂的数,**都有 N&(N-1)=0 ,** 所以这就是我们的判断条件。(这个技巧可以记忆下来,在一些别的位运算的题目中也是会用到的)

Expand All @@ -75,7 +75,7 @@ func isPowerOfTwo(n int) bool {

执行结果:

<img src="./802/4.jpg" alt="PNG" style="zoom: 80%;" />
<img src="802/4.jpg" alt="PNG" style="zoom: 80%;" />

## 03、证明过程

Expand All @@ -85,7 +85,7 @@ func isPowerOfTwo(n int) bool {

“阳春白雪,下里巴人”这个比喻虽然有点牵强,但是却难掩位运算的重要性。位运算在整个算法体系里,不少人可能会觉得有点食之无味、弃之可惜的意思。但其实,完全不是这样!有这种想法的,大多是初学者。对于这点,应该C系的玩家,会深有感触。万丈高楼平地起,暂且不说位运算在底层运算中占据了多大比重,单是整个leetcode列表里,打着位运算标签的题目就超过80余道,我想已经说明了问题。**至少,在面试这块,你必须对位运算了如指掌!** 所以,今天的题目算是一个引子,后面我会出一个位运算的专题,希望尽我所能,帮助大家攻克这一类型的问题。

<img src="./802/5.jpg" alt="PNG" style="zoom: 50%;" />
<img src="802/5.jpg" alt="PNG" style="zoom: 50%;" />

<br/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ date: 2020-06-21

那如何计算当前是第几位呢,我们可以构造一个掩码来进行,说掩码可能大家听着有点懵逼,其实就是弄个1出来,1的二进制是这样:

<img src="./803/1.jpg" alt="PNG" style="zoom: 67%;" />
<img src="803/1.jpg" alt="PNG" style="zoom: 67%;" />

我们只需要让这个掩码每次向左移动一位,然后与目标值求“&”,就可以判断目标值的当前位是不是1。比如目标值为21,21的二进制是这样:

<img src="./803/2.jpg" alt="PNG" style="zoom: 67%;" />
<img src="803/2.jpg" alt="PNG" style="zoom: 67%;" />

然后每次移动掩码,来和当前位进行计算:

<img src="./803/3.jpg" alt="PNG" style="zoom: 67%;" />
<img src="803/3.jpg" alt="PNG" style="zoom: 67%;" />

根据分析,完成代码:

Expand All @@ -92,7 +92,7 @@ public class Solution {

执行结果:

<img src="./803/4.jpg" alt="PNG" style="zoom: 80%;" />
<img src="803/4.jpg" alt="PNG" style="zoom: 80%;" />

注意:这里判断 n&mask 的时候,千万不要错写成 (n&mask) == 1,因为这里你对比的是十进制数。(恰好这个题我之前面试别人的时候问到过,对方就直接这么写了...)

Expand All @@ -104,7 +104,7 @@ public class Solution {

大家是否还记得昨天学会的技巧,昨天的题目我们通过计算 n & n-1 的值,来判断是否是 2 的幂。今天我们继续使用这个技巧,观察一下,**对于任意一个数,将 n 和 n-1 进行 & 运算,我们都可以把 n 中最低位的 1 变成 0**。比如下面这两对数:

<img src="./803/5.jpg" alt="PNG" style="zoom: 67%;" />
<img src="803/5.jpg" alt="PNG" style="zoom: 67%;" />

那下面就简单了,只需要不断进行这个操作就可以了。(翻CPP牌子,有没有好评的?)

Expand All @@ -126,7 +126,7 @@ public:

肯定有人又是看的一脸懵逼,我们拿 11 举个例子:(注意最后一位1变成0的过程)

<img src="./803/6.jpg" alt="PNG" style="zoom: 67%;" />
<img src="803/6.jpg" alt="PNG" style="zoom: 67%;" />

<br/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ date: 2020-06-23

可能有人直接都不知道异或是什么,所以还是举个例子,比如5异或3,也就是5⊕3,也就是5^3,是下面这样:

<img src="./804/1.jpg" alt="PNG" style="zoom: 67%;" />
<img src="804/1.jpg" alt="PNG" style="zoom: 67%;" />

根据分析,得出代码:(c 版本)

Expand Down Expand Up @@ -112,7 +112,7 @@ class Solution:

执行结果:

<img src="./804/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="804/2.jpg" alt="PNG" style="zoom: 80%;" />

## 03、题目进阶

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func singleNumber(nums []int) int {

执行结果:

<img src="./805/1.jpg" alt="PNG" style="zoom: 80%;" />
<img src="805/1.jpg" alt="PNG" style="zoom: 80%;" />

## 03、数学方式

Expand All @@ -87,7 +87,7 @@ func singleNumber(nums []int) int {

也就是说,如果把**原数组去重、再乘以3得到的值,刚好就是要找的元素的2倍**。举个例子:

<img src="./805/2.jpg" alt="PNG" style="zoom: 50%;" />
<img src="805/2.jpg" alt="PNG" style="zoom: 50%;" />

利用这个性质,进行求解:(python代码如下,这里要注意的是,使用int可能会因为超出界限报错)

Expand All @@ -99,7 +99,7 @@ class Solution:

执行结果:

<img src="./805/3.jpg" alt="PNG" style="zoom: 80%;" />
<img src="805/3.jpg" alt="PNG" style="zoom: 80%;" />

## 04、位运算

Expand All @@ -113,15 +113,15 @@ class Solution:

假如我们有 [21,21,26] 三个数,是下面这样:

<img src="./805/4.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/4.jpg" alt="PNG" style="zoom: 67%;" />

回想一下,之所以能用“**异或**”,其实我们是完成了一个 **同一位上有2个1清零** 的过程。上面的图看起来可能容易,如果是这样 (下图应为26^21):

<img src="./805/5.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/5.jpg" alt="PNG" style="zoom: 67%;" />

那对于“每个其余元素,均出现了三次”也是一样,如果我们可以完成 **一个同一位上的三个1清零的过程,** 也就是 a ?a ?a = 0,问题则迎刃冰解。那因为各语言中都没有这样一个现成的方法可以使用,所以我们需要构造一个。(想象一下,位运算也是造出来的对不对?)

<img src="./805/6.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/6.jpg" alt="PNG" style="zoom: 67%;" />

如何构造,这里先说第一种方法(注意,到这里我们的问题已经转化成了定义一种 a ? a ? a = 0 的运算),观察一下“异或”运算:

Expand All @@ -130,7 +130,7 @@ class Solution:
<center> 0^1=1 </center>
是不是可以理解为,其实就是二进制的加法,然后砍掉进位呢?

<img src="./805/7.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/7.jpg" alt="PNG" style="zoom: 67%;" />

**砍掉进位的过程,是不是又可以理解为对 2 进行取模**,也就是取余。到了这里,问题已经非常非常明确了。那我们要完成一个 a ? a ? a = 0 的运算,是不是其实就是让其二进制的每一位数都相加,最后再对 3 进行一个取模的过程呢?(一样,如果要定义一个 a ? a ? a ? a = 0 的运算,那就最后对 4 进行取模就可以了)

Expand All @@ -154,19 +154,19 @@ func singleNumber(nums []int) int {

如果对上面的代码不能理解,可以看看这个图,假设只有一个数 [21],我们通过不断右移的方式,获取其每一位上的1。当然,这里因为余数都是1,所以肯定都保留了下来,然后与 1 进行 “与”运算,最终再将其放入到对应的位数上。

<img src="./805/8.jpg" alt="PNG" style="zoom: 50%;" />
<img src="805/8.jpg" alt="PNG" style="zoom: 50%;" />

执行结果:

<img src="./805/9.jpg" alt="PNG" style="zoom: 80%;" />
<img src="805/9.jpg" alt="PNG" style="zoom: 80%;" />

在上面的代码中,**我们通过一个number,来记录每一位数出现的次数**。但是缺点是,我们记录了64位(Go语言中,int为32位以上)

<img src="./805/10.jpg" alt="PNG" style="zoom: 80%;" />
<img src="805/10.jpg" alt="PNG" style="zoom: 80%;" />

那如果我们可以同时对所有位进行计数,是不是就可以简化过程。因为我们的目的是把每一位与3取模进行运算,是不是就可以理解为其实是一个**三进制**。如果大家听不懂三进制的话,可以简单理解为3次一循环,也就是 00 - 01 - 10 - 11。但是又因为对于 11 这种情况,我们需要砍掉(上面已经说过了,相当于 11 - 00 的转化),所以我们就只有3个状态,00 - 01 - 10,所以我们采用 a 和 b 来记录状态。其中的状态转移过程如下:

<img src="./805/11.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/11.jpg" alt="PNG" style="zoom: 67%;" />

这里 a‘ 和 b’ 的意思代表着 a 和 b 下一次的状态。next 代表着下一个 bit 位对应的值。然后这是什么,不就是状态机嘛。。。我们通过 a 和 b 的状态变化,来完成次数统计。

Expand Down Expand Up @@ -220,7 +220,7 @@ class Solution {

当然,这个解法就相当牛皮了,反正我第一次做肯定是想不到的。。。我看了一下,第一个给出这个解法的人,应该是一位国外的工程师(某扣上面有很多人其实都是把题解翻译过来的,当然我有时也会哈哈哈哈,我觉得这某种意义上讲也是一个好的现象,挺好)不过毕竟非原创,还是得说明一下!

<img src="./805/12.jpg" alt="PNG" style="zoom: 67%;" />
<img src="805/12.jpg" alt="PNG" style="zoom: 67%;" />

<br/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ date: 2020-06-24

> 说高斯公式,估计大家听着懵逼,其实就是那个 1 2 3 ... n = (1 n) * n / 2,即:
>
> <img src="./806/1.jpg" alt="PNG" style="zoom: 80%;" />
> <img src="806/1.jpg" alt="PNG" style="zoom: 80%;" />

<br/>

首先求出数组的和,然后再利用公式求出前n 1项之和,最终求差值,即为缺失的值!比如下面长度为4的数组,缺失4。

<img src="./806/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="806/2.jpg" alt="PNG" style="zoom: 80%;" />

- 2 + 3 + 1 + 5 = 11
- (1 5) * 5 / 2=15
Expand Down Expand Up @@ -87,7 +87,7 @@ class Solution {

执行结果:

<img src="./806/3.jpg" alt="PNG" style="zoom: 80%;" />
<img src="806/3.jpg" alt="PNG" style="zoom: 80%;" />

## 03、位运算求解

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,15 @@ date: 2020-06-30

在最简单的形式中,二分查找对具有指定左索引和右索引的**连续序列**进行操作。我们也称之为**查找空间**。二分查找维护查找空间的左、右和中间指示符,并比较查找目标;如果条件不满足或值不相等,则清除目标不可能存在的那一半,并在剩下的一半上继续查找,直到成功为止。

<img src="./901/1.gif" alt="PNG" style="zoom: 80%;" />
<img src="901/1.gif" alt="PNG" style="zoom: 80%;" />

举例说明:比如你需要找1-100中的一个数字,你的目标是**用最少的次数**猜到这个数字。你每次猜测后,我会说大了或者小了。而你只需要每次猜测中间的数字,就可以将余下的数字排除一半。

<img src="./901/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="901/2.jpg" alt="PNG" style="zoom: 80%;" />

不管我心里想的数字如何,你在7次之内都能猜到,这就是一个典型的二分查找。每次筛选掉一半数据,所以我们也称之为 **折半查找**。一般而言,对于包含n个元素的列表,用二分查找最多需要log2n步。

<img src="./901/3.jpg" alt="PNG" style="zoom: 80%;" />
<img src="901/3.jpg" alt="PNG" style="zoom: 80%;" />

当然,一般题目不太可能给你一个如此现成的题型,让你上手就可以使用二分,所以我们需要思考,如何来构造一个成功的二分查找。大部分的二分查找,基本都由以下三步组成:

Expand Down Expand Up @@ -224,7 +224,7 @@ public class Solution {

执行结果:

<img src="./901/4.jpg" alt="PNG" style="zoom: 80%;" />
<img src="901/4.jpg" alt="PNG" style="zoom: 80%;" />

<br/>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Left 设置为 1 比较容易理解,因为我们可以直接处理掉 x 为 0

我们看一下下面这些数的值:

<img src="./902/1.jpg" alt="PNG" style="zoom: 80%;" />
<img src="902/1.jpg" alt="PNG" style="zoom: 80%;" />

很容易观察出,当 x>2 时,它的**整数平方根**一定小于等于 x/2 。即有 0 < 整数平方根 <= x/2。所以我们的问题转化为在 [0,x/2] 中找一个**特定值**,满足二分查找的条件。(当然,如果没有想到使用 x/2 作为 Right 而 直接使用 x ,其实也是可以的)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@ public int firstBadVersion(int n) {

我们自然是采用二分的思想,来进行查找。举个例子,比如我们版本号对应如下:

<img src="./903/1.jpg" alt="PNG" style="zoom: 80%;" />
<img src="903/1.jpg" alt="PNG" style="zoom: 80%;" />

如果中间的mid如果是错误版本,那我们就知道 mid 右侧都不可能是第一个错误的版本。那我们就令 right = mid,把下一次搜索空间变成[left, mid],然后自然我们很顺利查找到目标。

<img src="./903/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="903/2.jpg" alt="PNG" style="zoom: 80%;" />

根据分析,代码如下:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,27 +37,27 @@ date: 2020-07-03

当然,本题可以直接暴力搜索,但是这就就会被面试官撵出去。为了不被他撵出去,我们还是使用二分更为稳妥!**在二分搜索中,我们找到区间的中间点并根据某些条件决定去区间左半部分还是右半部分搜索**。但是麻烦的是,我们的数组被旋转了,因此肯定不能直接使用二分。那我们需要先观察一下,假若我们的原始数组如下:

<img src="./904/1.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/1.jpg" alt="PNG" style="zoom: 80%;" />

无论怎么旋转,我们都可以得到一个结论,首元素 > 尾元素,像是下面这样。虽然不知道这个结论有什么用,但是我们先记下来。

<img src="./904/2.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/2.jpg" alt="PNG" style="zoom: 80%;" />

继续进行观察,上面其实是两种极端情况,那如果普通的情况旋转,大概是下面这样:

<img src="./904/3.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/3.jpg" alt="PNG" style="zoom: 80%;" />

问题似乎变得简单了,旋转将原数组一分为二,并且我们已知了首元素值总是大于尾元素,那我们只要找到将其一分为二的那个点(该点左侧的元素都大于首元素,该点右侧的元素都小于首元素),是不是就可以对应找到数组中的最小值。

<img src="./904/4.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/4.jpg" alt="PNG" style="zoom: 80%;" />

然后我们通过二分来进行查找,先找到中间节点mid,如果中间元素大于首元素,我们就把mid向右移动。

<img src="./904/5.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/5.jpg" alt="PNG" style="zoom: 80%;" />

如果中间元素小于首元素,我们就把mid向左移动。

<img src="./904/6.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/6.jpg" alt="PNG" style="zoom: 80%;" />

根据分析,完成题解:

Expand Down Expand Up @@ -120,7 +120,7 @@ int findMin(int* nums, int numsSize){

执行结果:

<img src="./904/7.jpg" alt="PNG" style="zoom: 80%;" />
<img src="904/7.jpg" alt="PNG" style="zoom: 80%;" />

## 03、课后思考

Expand Down
Loading