面试题02.07
题目描述:
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。
示例:
解答:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
#双指针
ta, tb = headA, headB
while ta != tb:
ta = ta.next if ta else headB
tb = tb.next if tb else headA
return tb
面试题03.02
题目描述:
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。
示例:
解答:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.min_stack=list()
self.stack=list()
def push(self, x: int) -> None:
self.stack.append(x)
if not self.min_stack or x<=self.min_stack[-1]:
self.min_stack.append(x)
def pop(self) -> None:
tmp=self.stack.pop()
if tmp ==self.min_stack[-1]:
self.min_stack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
if not self.min_stack:
return None
return self.min_stack[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
剑指offer53-I
题目描述:
统计一个数字在排序数组中出现的次数。
示例:
解答:
class Solution:
def search(self, nums: List[int], target: int) -> int:
sum=0
for i in range(len(nums)):
if nums[i]==target:
sum+=1
return sum
剑指offer53-II
题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例:
解答:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
'''
二分查找
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] <= mid:
left = mid + 1
else:
right = mid - 1
return left
'''
sum = 0
n=len(nums)
total=(n*(n+1))//2
for i in range(len(nums)):
sum+=nums[i]
return total-sum
剑指offer57
题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例:
解答:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=len(nums)
l,r=0,n-1
while l<r:
sum=nums[l]+nums[r]
if sum==target:
return [nums[l],nums[r]]
elif sum>target:
r-=1
else:
l+=1
return []