第一题 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
先来一个python的bug方法:
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
else:
return min( rotateArray)
不知道面试的时候面试官看到会不会直接让我出去 _,再来一个bug的方法:
class Solution:
def minNumberInRotateArray(self, rotateArray):
if len(rotateArray) == 0:
return 0
else:
rotateArray.sort()
return rotateArray[0]
来一个正经的方法:
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
elif len(rotateArray) == 1:
return rotateArray[0]
else:
for i in range(0,len(rotateArray)-1):
if rotateArray[i] > rotateArray[i+1]:
return rotateArray[i+1]
return rotateArray[0]
二分查找:
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if len(rotateArray) == 0:
return 0
elif len(rotateArray) == 1:
return rotateArray[0]
else:
left = 0
right = len(rotateArray)-1
while left < right:
mid = (left + right) // 2
if rotateArray[mid] > rotateArray[right]:
left = mid+1
else:
right = mid
return rotateArray[left]
第二题 斐波那契数列
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
题目中的要求为: 0 1 1 2 3 5 8…………每项是前两项的和
先来一种最简单的方法:
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n == 0:
return 0
elif n == 1:
return 1
else:
f1 = 0
f2 = 1
for i in range(n-1):
f3 = f1 + f2
f1 = f2
f2 = f3
i +=1
return f3
再来一个升级版:
class Solution:
def Fibonacci(self, n):
# write code here
ret = [0,1,1]
while len(ret)-1 < n:
ret.append(ret[-1]+ret[-2])
return ret[n]
第三题 跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
1.假设当有n个台阶时假设有f(n)种走法。
2.青蛙最后一步要么跨1个台阶要么跨2个台阶。
3.当最后一步跨1个台阶时即之前有n-1个台阶,根据1的假设即n-1个台阶有f(n-1)种走法。
4. 当最后一步跨2个台阶时即之前有n-2个台阶,根据1的假设即n-2个台阶有f(n-2 )种走法。
5.显然n个台阶的走法等于前两种情况的走法之和即f(n)=f(n-1)+f(n-2)。
6.找出递推公式后要找公式出口,即当n为1、2时的情况,显然n=1时f(1)等于1,f(2)等于2
这很明显是一个首项为1 2 的斐波那契数列
class Solution:
def jumpFloor(self, number):
ret = [1,2,3]
while len(ret) < number:
ret.append(ret[-1]+ret[-2])
return ret[number-1]
第四题 变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
1.假设青蛙最后一次跳了一阶,那么有f(n-1)次跳法;假设青蛙最后一次跳了二阶,那么有f(n-2)种跳法……假设青蛙最后一次跳了n-1阶,那么有f(1)种跳法;假设青蛙最后一次跳了n阶,那么有f(0)种跳法,其中f(0) = 0
2.根据(1),有:f(n) = f(n-1) + f(n-2) + f(n-3) + …… + f(1) + f(0)
3.f(n-1) = f(n-2) + f(n-3) + …… + f(1) + f(0)
4.根据(2)、(3),有f(n) = 2f(n-1) = 2(2f(n-2)) = …… = 2**(n-1)[f(1)+ f(0)] = 2**(n-1)1 = 2*(n-1)
import math
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 0:
return 0
elif number > 0:
return math.pow(2,number-1)
第五题 举行覆盖
斐波那契数列数列,依旧可以画图找规律
# -*- coding:utf-8 -*-
class Solution:
def rectCover(self, number):
# write code here
ret = [0,1,2]
while len(ret)-1 < number:
ret.append(ret[-1]+ret[-2])
return ret[number]