1 二维数组中的查找
1.1 题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1.2 解题思路
方法1: 直接遍历输入的二维列表中的每一项,再判断其中是否存在给定的整数。代码如下:
class Solution:
def Find(self, target, array):
for i in array:
if target in i:
return True
return False
这种方法简单粗暴,很容易理解,但我觉得题目本意不在于此,而且题目中的排序对这种方法没什么益处。翻阅了一些资料后,又写了一种方法。
方法2: 取二维列表的右上方array[0][-1]与所给整数target对比,若target小,最后一列全部比target大,删除最后一列,若target大,则第一行全部比target小,删除第一行,直至找到target;若最后得出的array为空,则target不存在,返回False。
我首先想到的是递归实现,后来看了部分人的解法,发现不用递归也可以,就当练习一下递归吧。代码如下:
class Solution:
def Find(self, target, array):
if not array or not array[0]:
return False
elif target == array[0][-1]:
return True
elif target < array[0][-1]:
array = map(lambda x: x[:-1], array)
return self.Find(target, array)
else:
array = array[1:]
return self.Find(target, array)
4. 重建二叉树
4.1 题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
4.2 解题思路
二叉树的三种遍历方式为:
先序遍历:先访问根结点,再左子树,最后右子树;
中序遍历:先访问左子树,再根结点,最后右子树;
后序遍历:先访问左子树,再右子树,最后根结点。
若二叉树为空,则空操作。
给定前序遍历的序列,则第一个数一定为根结点,再中序遍历的结果中找到根结点,则根结点前面的序列为左子树中序遍历结果,后面为右子树中序遍历结果;再根据前序遍历的序列找到左右子树的前序遍历结果,这样就分别找到了左右子树的前、中序遍历结果,再以同样的方式构建左右子树,完成二叉树的重建。代码如下:
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if len(pre) == 0:
return None
else:
tree = TreeNode(pre[0])
node_index = tin.index(pre[0])
pre_left_tree = pre[1: 1+node_index]
pre_right_tree = pre[1+node_index:]
tin_left_tree = tin[: node_index]
tin_right_tree = tin[node_index+1:]
tree.left = self.reConstructBinaryTree(pre_left_tree, tin_left_tree)
tree.right = self.reConstructBinaryTree(pre_right_tree, tin_right_tree)
return tree
5. 用两个栈实现队列
5.1 题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
5.2 解题思路
栈是只能在表的一端进行插入和删除操作的线性表,我们称那一端为栈顶,则另一端为栈底。栈有“先进后出”的特性。队列是只能在表的一端进行插入,在另一端进行删除的线性表。插入的一端为队尾,删除的一端为队头。队列有“先进先出”的特性。
本题里,有两个栈stack1和stack2,我们可以在stack1中插入序列,这样序列是倒序的。为了满足队列“先进先出”的特性,可以将stack1中的序列导入stack2中,变为正序,这样再进行删除操作就可以了(注意在进行此步骤时,要看stack2是否为空,不为空时,说明已经将stack1数据导入了)。
再看添加操作,直接将数据加入stack1中即可。如果stack2中有数据,将stack2中的数据删完再将stack1中数据导入。代码如下:
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
# write code here
return self.stack1.append(node)
def pop(self):
# return xx
if not self.stack1 and not self.stack2:
return None
elif not self.stack2:
self.stack2 = list(reversed(self.stack1))
self.stack1 = []
return self.stack2.pop()
7. 斐波那契数列
7.1 题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39。
7.2 解题思路
斐波那契数列数列是一个用递归方法解决的典型例子,但是一旦n比较大时,递归的方法就会变得很慢,总结原因就是:
这样,就计算了好多重复的数据,从而使得计算时间变长。
为了简化运算,可以正向推导,给定 f(0)和f(1)依次计算 ,代码如下:
class Solution:
def Fibonacci(self, n):
# write code here
result = [0, 1]
if n <= 1:
return result[n]
else:
while len(result) < n+1:
result.append(result[-1] + result[-2])
return result[-1]
12 调整数组顺序使奇数位于偶数前面
12.1 题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
12.2 解题思路
新建两个列表,一个存奇数,一个存偶数。遍历所给列表,如果是偶数存在偶数列表,奇数存在奇数列表。最后将偶数列表里的数字放到奇数列表里。代码如下:
class Solution:
def reOrderArray(self, array):
# write code here
arr_even = []
arr_odd = []
for i in array:
if i % 2 == 0:
arr_even.append(i)
else:
arr_odd.append(i)
arr_odd.extend(arr_even)
return arr_odd