File tree 13 files changed +271
-33
lines changed
13 files changed +271
-33
lines changed Original file line number Diff line number Diff line change 8
8
- [ 旋转数组的最小数字] ( ./SwordToOffer/Doc/旋转数组的最小数字.md )
9
9
- [ 跳台阶] ( ./SwordToOffer/Doc/跳台阶.md )
10
10
- [ 变态跳台阶] ( ./SwordToOffer/Doc/变态跳台阶.md )
11
+ - [ *** 矩形覆盖*** ] ( ./SwordToOffer/Doc/矩形覆盖.md )
12
+ - [ 二进制中1的个数] ( ./SwordToOffer/Doc/二进制中1的个数.md )
13
+ - [ *** 数值的整数次方*** ] ( ./SwordToOffer/Doc/数值的整数次方.md )
14
+
Original file line number Diff line number Diff line change
1
+ # -*- coding:utf-8 -*-
2
+ class Solution :
3
+ def NumberOf1 (self , n ):
4
+ # write code here
5
+ count = 0
6
+ c = 1
7
+
8
+ for i in range (32 ):
9
+ p = c & n
10
+ if p != 0 :
11
+ count += 1
12
+ c = c << 1
13
+
14
+ return count
15
+
16
+ def NumberOf1_2 (self , n ):
17
+ count = 0
18
+ while n :
19
+ count += 1
20
+ n = (n - 1 ) & n
21
+ return count
22
+
23
+
24
+
25
+ solution = Solution ()
26
+ print solution .NumberOf1_2 (- 2 )
27
+
Original file line number Diff line number Diff line change
1
+ # -*- coding:utf-8 -*-
2
+ class Solution :
3
+ def Power (self , base , exponent ):
4
+ # write code here
5
+ if base == 0 :
6
+ return 0
7
+ if exponent == 0 :
8
+ return 1
9
+ flag = 1
10
+ if exponent < 0 :
11
+ flag = 0
12
+ exponent = - exponent
13
+
14
+ sum = 1.0
15
+ tmp = base
16
+ while (exponent > 0 ):
17
+ if exponent & 1 == 1 :
18
+ sum *= tmp
19
+ tmp *= tmp
20
+ exponent = exponent >> 1
21
+
22
+ if flag == 0 :
23
+ sum = 1 / sum
24
+
25
+ return sum
26
+
27
+
28
+ solution = Solution ()
29
+ # 00..11
30
+ print solution .Power (3 , 2 )
Original file line number Diff line number Diff line change 1
1
# -*- coding:utf-8 -*-
2
2
class Solution :
3
3
def jumpFloor (self , number ):
4
- a = 1
5
- b = 2
6
4
7
5
# write code here
8
6
if number == 1 :
9
7
return 1
10
8
elif number == 2 :
11
9
return 2
12
10
else :
13
- number = number - 2
14
- while number != 0 :
15
- c = a + b
16
- a = b
17
- b = c
18
- number -= 1
19
-
20
- return b
11
+ return self .jumpFloor (number - 1 ) + self .jumpFloor (number - 2 )
21
12
22
13
23
14
solution = Solution ()
Original file line number Diff line number Diff line change
1
+ # -*- coding:utf-8 -*-
2
+ class Solution :
3
+ def jumpFloorII (self , number ):
4
+ # write code here
5
+ if number == 1 :
6
+ return 1
7
+ elif number == 2 :
8
+ return 2
9
+ else :
10
+ return 2 * self .jumpFloorII (number - 1 )
11
+
12
+
13
+ solution = Solution ()
14
+ print solution .jumpFloorII (4 )
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def rectCover (self , number ):
3
+ # write code here
4
+ if number == 0 :
5
+ return 0
6
+ elif number == 1 :
7
+ return 1
8
+ elif number == 2 :
9
+ return 2
10
+ else :
11
+ c = 0
12
+ a = 1
13
+ b = 2
14
+ for i in range (number - 2 ):
15
+ c = a + b
16
+ a = b
17
+ b = c
18
+ return c
19
+
20
+
21
+ solution = Solution ()
22
+ print solution .rectCover (3 )
23
+
Original file line number Diff line number Diff line change
1
+ # title
2
+
3
+
4
+ ## 题目描述
5
+
6
+ ## 解题思路
7
+
8
+
9
+
10
+ ## 代码
11
+
12
+ [ 这里] ( ../Code/n.py )
Original file line number Diff line number Diff line change
1
+ # 二进制中1的个数
2
+
3
+
4
+ ## 题目描述
5
+ 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
6
+
7
+ ## 解题思路
8
+ 首先明确负数的补码是什么:
9
+ -1的原码则为1000 0001,其中第一个1,表示负号,是符号位。如果是正数则为0,-7的原码是1000 0111;
10
+ 计算机中的负数默认都是按照补码存储的。
11
+
12
+ ### 思路1
13
+
14
+ 如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
15
+ 举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.
16
+
17
+ 也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
18
+
19
+ ### 思路2
20
+
21
+ 利用位的运算,初始用1和目标数与去探测目标数二进制最低位是否为1,然后将1左移,以此类推探测后面的二进制位。
22
+
23
+
24
+ ## 代码
25
+
26
+ [ 这里] ( ../Code/10.py )
Original file line number Diff line number Diff line change 4
4
## 题目描述
5
5
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
6
6
7
-
8
7
## 解题思路
9
8
10
9
设共有m种不同跳法
15
14
对于n阶台阶:
16
15
17
16
- case1:第一次跳了1个台阶,就有f(n-1)种跳法
18
- - case2:第一次挑个2个台阶,就有f(n-2)种跳法
17
+ - case2:第一次跳个2个台阶,就有f(n-2)种跳法
18
+ - ...
19
+ - case n:第一次跳了n个台阶,就有0中跳法
20
+
21
+
22
+
23
+ 将所有情况加起来,对于n级台阶,有:` f(n)=f(1)+f(2)+f(3)+..+f(n-1)+1 ` 种跳法,如果直接用该式进行计算,每次计算f(n)时需要计算` n-1 ` 个` f ` ,会有很多重复计算,考虑:
24
+
25
+ ```
26
+ f(1)=1
27
+ f(2)=2
28
+ f(3)=f(2)+f(1)+1
29
+ f(4)=f(3)+f(2)+f(1)+1
30
+ f(5)=f(4)+f(3)+f(2)+f(1)+1
31
+ =f(4)+f(4)
32
+
33
+ f(6)=f(5)+f(4)+f(3)+f(2)+f(1)+1
34
+ =f(5)+f(5)
35
+
36
+ ```
19
37
20
- 所以总的n阶台阶的跳法f(n)=case1+case2=f(n-1)+f(n-2)
38
+ 可以发现:
39
+ ` f(n)=2*f(n-1) `
21
40
22
- 这是典型的斐波那契数列,需要注意的是尽量不要用递归去求解斐波那契数列,尽量使用循环,如果只需要第n项,不用保存所有n项数据,只需每次保存前2项即可 。
41
+ 利用该式即可解决此问题 。
23
42
24
43
25
44
## 代码
Original file line number Diff line number Diff line change
1
+ # 数值的整数次方
2
+
3
+
4
+ ## 题目描述
5
+ 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
6
+ ## 解题思路
7
+ 这是典型的快速求幂算法的题,举个例子:
8
+
9
+ $3 ^{ 999}$ = 3 * 3 * 3 * … * 3
10
+
11
+ 直接乘要做998次乘法,复杂度为$O(n)$.
12
+
13
+ 但事实上可以这样做,先求出2^k次幂:
14
+
15
+ $3 ^ 2$ = 3 * 3
16
+ $3 ^ 4$ = $3 ^ 2$* $3 ^ 2$
17
+ $3 ^ 8$ = $3 ^ 4$* $3 ^ 4$
18
+ $3 ^{16}$ = $3 ^ 8$ * $3 ^ 8$
19
+ $3 ^ {32}$ = $3 ^{16}$ * $3 ^{16}$
20
+ $3 ^{64}$ = $3 ^ {32} $* $3 ^ {32}$
21
+ $3 ^{128}$ = $3 ^ {64}$ * $3 ^ {64}$
22
+ $3 ^ {256}$ = $3 ^ {128}$ * $3 ^ {128}$
23
+ $3 ^ {512}$ = $3 ^ {256}$ * $3 ^ {256}$
24
+
25
+ 再相乘:
26
+
27
+ $3 ^ {999}$
28
+ = $3 ^ {(512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)}$
29
+ =$ 3 ^ {512}* 3 ^ {256} * 3 ^ {128} * 3 ^ {64}* 3 ^ {32} * 3 ^ 4 * 3 ^ 2 * 3$
30
+
31
+ 这样只要做16次乘法,复杂度为$O(logn)$,即使加上一些辅助的存储和运算,也比直接乘高效得多(尤其如果这里底数是成百上千位的大数字的话)。
32
+ 我们发现,把999转为2进制数:1111100111,其各位就是要乘的数.
33
+
34
+ 所以我们只需利用exponent的二进制位即可,同时需要考虑exponent和base的特殊情况,比如0 、正、负等。
35
+
36
+
37
+
38
+ ## 代码
39
+
40
+ 核心代码:
41
+
42
+ ``` python
43
+ sum = 1.0
44
+ tmp = base
45
+ while (exponent > 0 ):
46
+ if exponent & 1 == 1 :
47
+ sum *= tmp
48
+ tmp *= tmp
49
+ exponent = exponent >> 1
50
+ ```
51
+
52
+ [ 这里] ( ../Code/11.py )
53
+
Load Diff This file was deleted.
Original file line number Diff line number Diff line change
1
+ # 矩形覆盖
2
+
3
+
4
+ ## 题目描述
5
+ 我们可以用2$\times$1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2$\times$1的小矩形无重叠地覆盖一个2$\times$n的大矩形,总共有多少种方法?
6
+ ## 解题思路
7
+
8
+ ![ 8] ( https://ws1.sinaimg.cn/large/006tKfTcly1g0as26m4uuj30gz076q2x.jpg )
9
+
10
+ ## 代码
11
+
12
+ [ 这里] ( ../Code/9.py )
Original file line number Diff line number Diff line change
1
+ # 变态跳台阶
2
+
3
+
4
+ ## 题目描述
5
+ 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
6
+
7
+ ## 解题思路
8
+
9
+ 设共有m种不同跳法
10
+
11
+ - 如果n=1,那么m=1
12
+ - 如果n=2,那么m=2
13
+
14
+ 对于n阶台阶:
15
+
16
+ - case1:第一次跳了1个台阶,就有f(n-1)种跳法
17
+ - case2:第一次跳个2个台阶,就有f(n-2)种跳法
18
+ - ...
19
+ - case n:第一次跳了n个台阶,就有0中跳法
20
+
21
+
22
+
23
+ 将所有情况加起来,对于n级台阶,有:` f(n)=f(1)+f(2)+f(3)+..+f(n-1)+1 ` 种跳法,如果直接用该式进行计算,每次计算f(n)时需要计算` n-1 ` 个` f ` ,会有很多重复计算,考虑:
24
+
25
+ ```
26
+ f(1)=1
27
+ f(2)=2
28
+ f(3)=f(2)+f(1)+1
29
+ f(4)=f(3)+f(2)+f(1)+1
30
+ f(5)=f(4)+f(3)+f(2)+f(1)+1
31
+ =f(4)+f(4)
32
+
33
+ f(6)=f(5)+f(4)+f(3)+f(2)+f(1)+1
34
+ =f(5)+f(5)
35
+
36
+ ```
37
+
38
+ 可以发现:
39
+ ` f(n)=2*f(n-1) `
40
+
41
+ 利用该式即可解决此问题。
42
+
43
+
44
+ ## 代码
45
+
46
+ [ 这里] ( ../Code/8.py )
You can’t perform that action at this time.
0 commit comments