往期内容在这里:
大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)每篇更新5篇,艾瑞巴迪和我一起刷起来!!
200道大数据面试常考Leetcode算法题16- 最接近的三数之和
Leetcode原题:
题解为:
class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: # 排序 nums.sort() diff = float('inf') # 差值为target - total,初始化时设置为无穷大 # 循环长度-1次,因为下标从0开始,全部循环完下标为长度-1 for i in range(len(nums) - 1): # 左指针为当前值的下一个 left = i + 1 # 右指针为最后一个 right = len(nums) - 1 # 判断左边是否小于右边 while left < right: # 和为当前值加上左指针和右指针 total = nums[i] + nums[left] + nums[right] # 假如目标值-当前和小于初始值,则更新差值 if abs(target - total) < abs(diff): diff = target - total # 假如当前和小于目标值,说明当前和小了,则要变大,移动左指针 if total < target: left += 1 # 假如当前和大于目标值,说明当前和大了,则要变小,移动右指针 elif total > target: right -= 1 # 假如当前和等于目标值,则返回目标值 else: return target # 最后返回最接近的值 return target - diff
200道大数据面试常考Leetcode算法题17- 电话号码的字母组合
Leetcode原题:
题解为:
class Solution: def letterCombinations(self, digits: str) -> List[str]: # 数字对应的英文字母列表 word_list = ["0", "0", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"] # 如果是空字符串直接返回空列表 if digits == "": return [] # 保存结果列表 result = [] # 输入的digits的长度,作为回溯函数返回的判断条件 lenth = len(digits) # 回溯函数(path当前路径,默认为"") def back_track(digits, index, path): # 如果目前path的长度和digits的长度相等,说明已经遍历完一趟,返回结果列表 if len(path) == lenth: # 加入result列表 result.append(path) # 返回 return # 遍历当前索引的数字对应的英文列表 for word in word_list[int(digits[index])]: # 路径加上当前字母 path = path + word # 递归下一个数字对应的英文列表 back_track(digits, index + 1, path) # 撤销当前字母 path = path[:-1] back_track(digits, 0, "") return result
200道大数据面试常考Leetcode算法题18- 四数之和
Leetcode原题:
题解为 :
class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: n = len(nums) # 列表长度 if n < 4: # 列表长度<4 直接返回 return [] nums.sort() # 列表排序 res = [] # 结果列表 for a in range(n-3): # 第一层循环 if a > 0 and nums[a] == nums[a-1]: # 判断重复值 continue for b in range(a+1, n-2): # 第二层循环 if b > a+1 and nums[b] == nums[b-1]: # 判断重复值 continue c = b+1 # c指针 左指针 d = n-1 # d指针 右指针 while c < d: # 移动指针 if nums[a]+nums[b]+nums[c]+nums[d] < target: # 小于目标值左指针右移 c += 1 elif nums[a]+nums[b]+nums[c]+nums[d] > target: # 大于目标值右指针左移 d -= 1 else: # 等于目标值添加到结果列表 res.append([nums[a], nums[b], nums[c], nums[d]]) while c < d and nums[c]==nums[c+1]: # 去除重复值 c += 1 while c < d and nums[d]==nums[d-1]: # 去除重复值 d -= 1 c += 1 # 左指针右移 d -= 1 # 右指针左移 return res # 返回结果列表
200道大数据面试常考Leetcode算法题19- 删除链表的倒数第N个结点
Leetcode原题:
题解为:
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: # 判断链表没有头节点即为空的时候,返回空 if not head or not head.next: return None # 定义两个指向头节点的快慢指针 fast, slow = head, head # 快指针循环n次先走n步 for _ in range(n): fast = fast.next # 此时快指针为空,表示链表的长度也为 n,只需要删除链表的头节点; if not fast: return head.next # 当快指针还没到终点时,快慢同时向前走一步 while fast.next: fast, slow = fast.next, slow.next # 快指针走到终点时,慢指针到达链表的倒数第 n 个节点的前一节点(倒数第 n - 1 个节点); # 把将倒数第 n 个节点的前一节点指向倒数第 n 个节点的下一节点, # 相当于删除了倒数第 n 个节点 slow.next = slow.next.next return head
200道大数据面试常考Leetcode算法题20- 有效的括号
Leetcode原题:
题解为:
class Solution: def isValid(self, s: str) -> bool: # 临时栈,只能装一对括号 stk = [] for c in s: # 如果c是 ({[ 则入栈 if c in ['(','[','{']: stk.append(c) # 如果c是 )}] 并且栈不为空 则 判断最后一个(即栈顶)是否为与之对应的左括号 是则出栈,不是则返回fasle elif c == ')' and stk and stk[-1] == '(': stk.pop(); elif c == ']' and stk and stk[-1] == '[': stk.pop(); elif c == '}' and stk and stk[-1] == '{': stk.pop() else: # 如果c是 )}] 栈为空 那么返回false # 如果c是 )}] 栈不为空, 但是 栈顶不是与c对应的左括号 那么返回false return False # 例如"(){}[" ,如果最后栈不为空,那么就是有多余的左括号了 return not stk
好啦,这期的分享到这里结束啦!我们下期再见!