剑指offer刷题(九)——矩阵覆盖
题目
可以用21的矩形横着或者竖着去覆盖更大的矩形.请问n个21的矩形无重叠的覆盖一个2×n的大矩形,总共有多少种方法?
思路
这种n个的题目,我们先一一列举n小的数目的结果:
n=1:1种
n=2:2种:横着2个;竖着2个
n=3:3种:可以在n=2的基础上加1列,也可以在n=1的基础上加2列,加的2列可以参考n=2的情况;
n=4:5种:可以在n=3的基础上加1列;也可以在n=2的基础上,加2列,但是此时2×1的小矩形必须是一上一下摆放,不能一左一右,否则与n=3里的情况有重复.
由上述列举可以观察到现象,一般
有f(n)=f(n-1)+f(n-2);
仍然是斐波那契数列
C++
1 |
|
Python
斐波那契变体1
2
3
4
5
6
7
8
9
10class Solution:
def rectCover(self, number):
# write code here
A=[0,1,2]
if number<=2:
return A[number]
else:
for i in range(3,number+1):
A.append(A[i-2]+A[i-1])
return A[number]
剑指Offer刷题(十一):二进制中1的个数
题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路
一个二进制数,例如1100,它的第一个1出现在右边数起的第三个,如果将该二进制减去1,它将从刚刚那个1出现的位置开始,各个值取反.而刚刚那个1左侧的值都不变.例如1100-1=1011。此时我们若将这两个值进行与运算,则会出现1100&1011=1000.即原来的二进制上的数去掉了一个1.我们可以重复上述步骤,从而统计二进制中1的个数.
C++
1 |
|
Python1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class Solution:
def NumberOf1(self, n):
# write code here
sum=0
if(n>=0):
m=list(bin(n)[2:])
for i in m:
if(i=='1'):
sum+=1
else:
m=list((bin(((1 << 32) - 1) & n)[2:]).zfill(32))
for i in m:
if(i=='1'):
sum+=1
return sum
关键是计算补码:
bin(1<<32)将1的2进制左移32位,相当于2的32次方
&将两个数的二进制进行与运算.
.zfill(32)填充32位
剑指Offer刷题(十二):数值的整数次方
题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
首先我们要知道这题要求我们不得使用库函数,同时不需要考虑大数问题。
这题目有以下几点需要注意:
- 0的0次方在数学上是没有意义的
- 0的负数次方相当于0作为除数,这也是无意义的
- 判断double 类型的base是否等于0不能用==号.因为计算机表述小数(包括float和double型小数)都有误差,不能直接使用 $( == )$判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个double类型是的数相等
C++
1 |
|
剑指Offer刷题(十三):调整数组顺序使奇数位于偶数前面
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路
使用一个双向队列,遍历数组,使得奇数前插入,偶数后插入。
C++
1 |
|
剑指Offer刷题(十四):链表中倒数第k个结点
题目
输入一个链表,输出该链表中倒数第k个结点。
思路
这里采用两个指针的方法,一个指针p1指向链表的第一个元素.第二个指针p2指向链表的第k个元素.p1与p2同时往后移动,当p2达到最后一个元素时,p1指向的是倒数第k个元素.(这里要区分最后一个元素是倒数第0个还是倒数第1个,在这里我考虑的是最后一个元素是倒数第0个).
注意:链表里的元素个数很有可能还没有k大,返回的是NULL.
C++
1 |
|
剑指Offer刷题(十五):反转链表
题目
输入一个链表,反转链表后,输出链表的所有元素。
思路
方法1. 可以用一个栈来存储节点
方法2. 用三个指针,分别调换前两个指针的方向,第三个指针指示下一个节点
C++
1 |
|