Skip to content

Commit d61b463

Browse files
committed
2.18
1 parent 36531c7 commit d61b463

13 files changed

+271
-33
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@
88
- [旋转数组的最小数字](./SwordToOffer/Doc/旋转数组的最小数字.md)
99
- [跳台阶](./SwordToOffer/Doc/跳台阶.md)
1010
- [变态跳台阶](./SwordToOffer/Doc/变态跳台阶.md)
11+
- [***矩形覆盖***](./SwordToOffer/Doc/矩形覆盖.md)
12+
- [二进制中1的个数](./SwordToOffer/Doc/二进制中1的个数.md)
13+
- [***数值的整数次方***](./SwordToOffer/Doc/数值的整数次方.md)
14+

SwordToOffer/Code/10.py

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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+

SwordToOffer/Code/11.py

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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)

SwordToOffer/Code/7.py

+1-10
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
# -*- coding:utf-8 -*-
22
class Solution:
33
def jumpFloor(self, number):
4-
a=1
5-
b=2
64

75
# write code here
86
if number == 1:
97
return 1
108
elif number == 2:
119
return 2
1210
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)
2112

2213

2314
solution = Solution()

SwordToOffer/Code/8.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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)

SwordToOffer/Code/9.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+

SwordToOffer/Doc/doc-sample.md

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# title
2+
3+
4+
## 题目描述
5+
6+
## 解题思路
7+
8+
9+
10+
## 代码
11+
12+
[这里](../Code/n.py)
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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)

SwordToOffer/Doc/变态跳台阶.md

+23-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
## 题目描述
55
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
66

7-
87
## 解题思路
98

109
设共有m种不同跳法
@@ -15,11 +14,31 @@
1514
对于n阶台阶:
1615

1716
- 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+
```
1937

20-
所以总的n阶台阶的跳法f(n)=case1+case2=f(n-1)+f(n-2)
38+
可以发现:
39+
` f(n)=2*f(n-1)`
2140

22-
这是典型的斐波那契数列,需要注意的是尽量不要用递归去求解斐波那契数列,尽量使用循环,如果只需要第n项,不用保存所有n项数据,只需每次保存前2项即可
41+
利用该式即可解决此问题
2342

2443

2544
## 代码
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+

SwordToOffer/Doc/文档模板.md

-19
This file was deleted.

SwordToOffer/Doc/矩形覆盖.md

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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)

doc-sample.md

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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)

0 commit comments

Comments
 (0)