文章目录
-
-
- 3.数组中重复的数字
- 4.二维数组中的查找
- 5.替换空格
- 6.从尾到头打印链表
- 7.重建二叉树
- 8.二叉树的下一个结点
- 9.用两个栈实现队列
- 10.斐波那契数列
- 11.旋转数组中的最小数字
- 15.二进制中 1 的个数
- 18.删除列表中重复的结点
- 21.调整数组顺序使奇数位于偶数前面
- 22.链表中倒数第 k 个结点
- 23.链表中环的入口结点
- 24.反转链表
- 25.合并两个排序的链表
- 27.二叉树的镜像
- 30.包含min函数的栈
- 32.从上到下打印二叉树
- 35.复杂链表的复制
- 39.数组中出现次数超过一半的数字
- 42.连续子数组的最大和
- 48.最长不含重复字符的子字符串
- 52.两个链表的第一个公共结点
- 55.二叉树的深度
- 57.和为S的两个数
- 58.翻转字符串
- 59.队列的最大值
- 62.圆圈中最后剩下的数字
- 63.股票的最大利润
- 65.不用加减乘除做加法
- 66.构建乘积数组
-
3.数组中重复的数字
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
解法
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, numbers, duplication):
if not numbers:
return False
for i, v in enumerate(numbers):
if v >= len(numbers) or v < 0:
return False
for i in range(len(numbers)):
while numbers[i] != i:
if numbers[i] == numbers[numbers[i]]:
duplication[0] = numbers[i]
return True
else:
idx = numbers[i]
numbers[i], numbers[idx] = numbers[idx], numbers[i]
return False
使用 O(1) 空间的解法
class Solution(object):
def duplicateInArray(self, nums):
f = s = 0
while f == 0 or f != s:
f = nums[nums[f]]
s = nums[s]
f = 0
while f != s:
f = nums[f]
s = nums[s]
return s
4.二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法:
class Solution:
def Find(self, target, array):
if not array:
return False
row = len(array) # 数组的行数
col = len(array[0]) # 数组的列数
i = row - 1
j = 0 # i, j这样规定是从左下开始查找,也可以从右上
while i >= 0 and j < col: # 双指针来判断是否在array中
if array[i][j] == target:
return True # 如果等于输出True
elif array[i][j] > target:
i -= 1 # 如果大于则往上移一格
else:
j += 1 # 如果小于则往右移一格
return False #如果最后走到了边界仍没有,则输出False
5.替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为 We Are Happy .则经过替换之后的字符串为 We%20Are%20Happy 。
解法:
class Solution:
# s 源字符串
def replaceSpace(self, s):
res = ''
for i in range(len(s)-1, -1, -1):
if s[i] == ' ':
res += '02%'
else:
res += s[i]
return res[::-1]
6.从尾到头打印链表
题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
解法:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
res = []
while listNode:
res.append(listNode.val)
listNode = listNode.next
return res[::-1]
7.重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解法:
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if not pre or not tin:
return None
root = TreeNode(0)
root.val = pre[0]
idx = tin.index(pre[0])
root.left = self.reConstructBinaryTree(pre[1: idx + 1], tin[:idx])
root.right = self.reConstructBinaryTree(pre[idx + 1:], tin[idx + 1:])
return root
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
def predfs(stop):
if pre and tin[0] != stop:
root = TreeNode(pre.pop(0))
root.left = predfs(root.val)
tin.pop(0)
root.right = predfs(stop)
return root
tin, pre = tin[:], pre[:]
return predfs(None)
8.二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解法:
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode): # 这道题情况一定要考虑全
if not pNode:
return None
if pNode.right: # 如果有右结点,那么此时pNode是根结点,
# 下一个结点是右子树的最左边的结点
pNode = pNode.right
while pNode.left:
pNode = pNode.left
return pNode
while pNode.next: # 用来判断当前结点是不是根结点
if pNode.next.left == pNode:
# 如果是左结点,那么返回它的父结点
return pNode.next
pNode = pNode.next # 如果不是,再向上找
return pNode.next
9.用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解法:
class Solution:
def __init__(self):
self.s1 = []
self.s2 = []
def push(self, node):
while self.s1:
self.s2