剑指offer(jz1--jz10)

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
好,又是一个类似于台阶问题的动态规划。详细代码如上上题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值