剑指offer-Python3版(四)
矩形覆盖
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:
例如 n=1那就是只有一种
n=2
有2种情况
n=3
有3种情况
n=4
有5种情况
。。。
能一眼就能看出来斐波那契的orz,当然仔细摸索到n=5,差不多就能知道了。
f
(
n
)
=
{
1
,
n
=
1
2
,
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
2
f(n)=\begin{cases} 1,& n=1 \\ 2,& n=2 \\ f(n-1)+f(n-2) & n>2\\ \end{cases}
f(n)=⎩⎪⎨⎪⎧1,2,f(n−1)+f(n−2)n=1n=2n>2
class Solution:
def rectcover(self, n):
if n <= 0:
return '不能<=0'
if n == 1:
return 1
else:
a, b = 1, 1
while n > 1:
a, b = b, a + b
n -= 1
return b
if __name__ == '__main__':
s = Solution()
num = int(eval(input('输入数字:')))
print(s.rectcover(num))
二进制中1的个数
Q:输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
思路
你考虑正负你就完了,so
反正不是用正常逻辑走的
class Solution:
def binaryonenum(self, n):
# 一法
#onenum = 0
# for i in range(32):
# onenum += (n >> i) & 1
# return onenum
# 上面的精简版
# return sum([(n >> i & 1) for i in range(32)])
# 二法
# 这个办法对于python是可行的,
# 因为不像java、C int类型长度有限制,python 数字大小可以无限扩大
# n= n&0xffffffff的作用就是对于负数而言,提取负数的后32位,
# 前面的任意位变成0,不用担心负数陷入死循环
count = 0
if n < 0:
n = n & 0xffffffff
while n:
count += 1
n = (n - 1) & n
return count
if __name__ == '__main__':
s = Solution()
num = int(eval(input('输入数字:')))
print(s.binaryonenum(num))
数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路
就只要考虑一下 指数的正负,当然base<0也要考虑
class Solution:
def qurt(self, base, exponent):
result = 1
if base == 0:
return 0
if exponent == 0:
return 1
if exponent < 0:
for i in range(-exponent):
result *= base
return 1 / result
else:
for i in range(exponent):
result *= base
return result
if __name__ == '__main__':
s = Solution()
num1 = int(eval(input('输入base:')))
num2 = int(eval(input('输入exponent:')))
print(s.qurt(num1, num2))