学习目标:
Shoppee 技术面试题库-简单:- 94.二叉树的中序遍历
- 303.区域和检索
- 剑指offer 52,两个链表的第一个公共节点(同160)
- 292.Nim游戏
- 415.字符串相加
- 9.回文数
- 剑指offer27.二叉树的镜像
- 88.合并两个有序数组
- 合并排序的数组
- 278.第一个错误的版本
学习时间:
14:54开始学习笔记:
94.二叉树的中序遍历
# result = list() 不能用全局变量,因为leetcode在测试完一个用例到下一个的时候,不会再运行这一句
class Solution(object):
def __init__(self):
self.result = list() # 类成员变量
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if root is None:
return []
node = root
self.inorderTraversal(node.left)
self.result.append(node.val)
self.inorderTraversal(node.right)
return self.result
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
result = list()
self.inorder(root, result)
return result
def inorder(self, root, result):
if root is None:
return []
node = root
self.inorde(node.left, result)
result.append(node.val)
self.inorder(node.right, result)
303.区域和检索
class NumArray(object):
def __init__(self, nums):
"""
:type nums: List[int]
"""
if not nums:
return None
l = len(nums)
self.dp = [0 for _ in range(l)]
self.dp[0] = nums[0]
for i in range(1, l):
self.dp[i] = self.dp[i-1] + nums[i]
def sumRange(self, left, right):
"""
:type left: int
:type right: int
:rtype: int
"""
if left == 0: # 一定要单独考虑,否则下面的left-1会变成dp[-1]错误
return self.dp[right]
else:
return self.dp[right] - self.dp[left-1]
剑指offer 52,两个链表的第一个公共节点(同160)
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
dic = {}
temp = headA
while temp:
dic[temp] = 1
temp = temp.next
temp = headB
while temp:
if temp in dic:
return temp
temp = temp.next
return None
292.Nim游戏
如果石头堆中只有一块、两块、或是三块石头,那么在你的回合,你就可以把全部石子拿走,从而在游戏中取胜。而如果就像题目描述那样,堆中恰好有四块石头,你就会失败。因为在这种情况下不管你取走多少石头,总会为你的对手留下几块,使得他可以在游戏中打败你。因此,要想获胜,在你的回合中,必须避免石头堆中的石子数为 4 的情况。
class Solution(object):
def canWinNim(self, n):
"""
:type n: int
:rtype: bool
"""
return(n%4!=0) # 取余
415.字符串相加
class Solution(object):
def addStrings(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
res = ''
carry, i, j = 0, len(num1)-1, len(num2)-1
while i >= 0 or j >= 0 or carry > 0: # carry>0但ij小于0的情况是算完最后一位(最高位)之后要进位
if i >= 0:
carry += ord(num1[i]) - ord('0')
if j >= 0:
carry += ord(num2[j]) - ord('0') # ord('s')<==>chr(115)对应
res += str(carry%10) # %代表取余,个位在第一个位置
carry = carry // 10 # 取整数部分,向下取整
i -= 1 # 从后往前算
j -= 1
return res[::-1] # 从后往前输出str