jz1 二维数组中的查找
描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
思路
根据数组的特点,一行递增,一列递增。要查找数字是否在该数组中,遍历是暴力解法。由于数组是有序的。可以选取右上角的元素比较,每次比较去掉一行或一列。
代码如下:
def find(array,target):
i=0
j=len(array[0])
while i<=len(array)-1 and j<=0:
if array[i][j]<target:
i+=1
elif array[i][j]>target:
j-=1
else:
retrun True
return False
jz2 替换空格
描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路
暴力解法:字符串是可以用for循环迭代出来的,此时可以设置一个空字符串,只要不等于空格就加上。等于空格加%20。
利用python中的函数进行简化。
代码如下:
def replace(string):
return '%20'.join(string.split(' '))
jz3 从尾到头打印链表
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
思路
遍历链表把获取的值放入到列表中,每次插入到头部,完成链表的反向。
代码如下:
def reverse(head):
result=[]
while head:
result.insert(0,head.val)
head=head.next
return result
jz4 重建二叉树
描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
先要明白二叉树的前序遍历和中序遍历的顺序。前序是根–左--右
中序是左–根--右
获取二叉树的根,再找到中序中根的序号。根据根的序号进行划分,迭代输出。
关键是找到根节点。
代码入下:
def rebulid(pre,center):
if len(pre)==1:
head=TreeNode(prer[0])
head.left=None
head.right=None
head=TreeNode(pre[0])
temp1=tin.index(pre[0])
if temp1==0:
head.left=None
else:
head.left=rebulid(pre[1:temp1+1],tin[:temp1])
if temp1==len(center)-1:
head.right=None
else:
head.right=rebulid(pre[temp1+1:],tin[temp1+1:])
return head
jz5 用两个栈实现单向队列
描述
用两个栈来实现一个队列,分别完成在队列尾部插入整数(push)和在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
思路
一共有入队和出队功能。push,pop.
建立两个栈,A栈和B栈,A栈用来push操作。尾部插入元素。
B栈用作pop操作。当B栈有元素时,出栈。没有元素时,B栈从A栈获取。
代码如下:
class Solution:
def __init__(self):
self.stack1=[]
self.stack2=[]
def push(self,number):
self.stack1.append(number)
def pop(self):
if self.stack2:
return self.stack2.pop()
elif not self.stack:
return None
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
jz6 旋转数组的最小数字
描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
简单易懂的方法:设置指针,判断是否前一个数大于后一个数,是的话返回后一个数。最后如果没有返回,立即返回第一个数。
def find(array):
for i in range(len(array)-1):
if array[i]>array[i+1]:
return array[i+1]
else:
return array[0]
jz7 斐波那契数列
描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
思路
原来是想创建一个列表,存放每次的值。但有点浪费空间,于是只需要两个值就行。
代码如下:
def fibo(n):
if n==0:
return 0
if n==1 0r n==2:
return 1
a=1
b=1
c=0
for i in range(3:n+1):
c=a+b
a=b
b=c
return c
jz8 跳台阶
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路
类似于jz7
代码如下:
def fibo(n):
if n==0:
return 0
if n==1:
return 1
if n==2:
return 2
a=1
b=2
c=0
for i in range(3:n+1):
c=a+b
a=b
b=c
return c
jz9 跳台阶扩展问题
描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
思路
一级台阶有一种跳法,两级有两种,三级台阶有四中,四级台阶有八种,数学归纳出是二的n-1次方。
代码就不详细写了。
jz10 矩形覆盖问题
描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方法?
比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):
思路
单纯的思考找不出规律,先列出几个简单的,寻找其中的规律
n=0 ----0
n=1 -----1
n=2 ------2
n=3 ------3
n=4 -------5
好,又是一个类似于台阶问题的动态规划。详细代码如上上题。