当前位置:   article > 正文

200道大数据面试常考Leetcode算法题01-05(python带代码解析)

200道大数据面试常考Leetcode算法题01-05(python带代码解析)

大家好,从本次开始,为大家推荐200道大数据面试常考Leetcode算法题,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)每篇更新5篇,艾瑞巴迪和我一起刷起来!!

200道大数据面试常考Leetcode算法题01-两数之和

Leetcode原题为:

 题解为:

  1. class Solution:
  2. def twoSum(self,nums,target):
  3. """
  4. :param nums: [3,2,4]
  5. :param target: 6
  6. :return: List[int] [1,2]
  7. """
  8. if not nums: # 假如不存在nums数组,则返回None,提前做异常处理
  9. return None
  10. result = [] # 定义一个查询列表用于比较nums前后数的容器,
  11. for i in range(len(nums) - 1): # 对nums列表进行循环
  12. result.append(nums[i]) # 每循环一个就装到result等待比对
  13. another_num = target - nums[i+1] # targer减去当前循环数i的下一位
  14. if another_num in result: # 判断targer减去当前循环数i的下一位的差是否在result里
  15. # 存在则保存relust列表中存在another_nums数的索引以及nums当前i下一个数的索引
  16. return [result.index(another_num), i + 1]
  17. return None

200道大数据面试常考Leetcode算法题02-两数相加

Leetcode原题为:

题解为:

  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. # def __init__(self, x):
  4. # self.val = x
  5. # self.next = None
  6. class Solution:
  7. def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
  8. # 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历
  9. dummy = p = ListNode(None)
  10. s = 0 # 每一步的求和暂存变量
  11. while l1 or l2 or s:
  12. # 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)
  13. s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
  14. p.next = ListNode(s % 10) # p.next 指向新链表, 用来创建一个新的链表
  15. p = p.next # p 向后遍历
  16. s //= 10 # 有进位情况则取模, eg. s = 18, 18 // 10 = 1
  17. l1 = l1.next if l1 else None # 如果l1存在, 则向后遍历, 否则为 None
  18. l2 = l2.next if l2 else None # 如果l2存在, 则向后遍历, 否则为 None
  19. return dummy.next # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点

200道大数据面试常考Leetcode算法题03-无重复字符的最长字串

Leetcode原题为:

题解为:

  1. class Solution:
  2. def lengthOfLongestSubstring(self, s: str) -> int:
  3. start, res, c_dict = -1, 0, {} # start为起始索引位置,res为返回的最大长度,c_dict为测试字典
  4. for i, c in enumerate(s): # 对输入字符串进行循环,i为下标,c为字符
  5. if c in c_dict and c_dict[c] > start: # 字符c在字典中 且 上次出现的下标大于当前长度的起始下标
  6. start = c_dict[c] # 起始位置变成当前c_dict中存在的字符c的下标
  7. c_dict[c] = i # 当前测试字典的c字符索引变为当前循环次数
  8. else:
  9. c_dict[c] = i # 当前测试字典的c字符索引变为当前循环次数
  10. res = max(res, i-start) # 返回最大长度,res为上一个res,i-k为窗口大小,末减初,找出最大长度
  11. return res

200道大数据面试常考Leetcode算法题04-寻找两个正序数组的中位数

Leetcode原题为:

 题解为:

  1. class Solution:
  2. def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
  3. if len(nums1) > len(nums2):
  4. return self.findMedianSortedArrays(nums2, nums1)
  5. infinty = 2**40
  6. m, n = len(nums1), len(nums2)
  7. left, right = 0, m
  8. # median1:前一部分的最大值
  9. # median2:后一部分的最小值
  10. median1, median2 = 0, 0
  11. while left <= right:
  12. # 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]
  13. # // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]
  14. i = (left + right) // 2
  15. j = (m + n + 1) // 2 - i
  16. # nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]
  17. nums_im1 = (-infinty if i == 0 else nums1[i - 1])
  18. nums_i = (infinty if i == m else nums1[i])
  19. nums_jm1 = (-infinty if j == 0 else nums2[j - 1])
  20. nums_j = (infinty if j == n else nums2[j])
  21. if nums_im1 <= nums_j:
  22. median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)
  23. left = i + 1
  24. else:
  25. right = i - 1
  26. return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

200道大数据面试常考Leetcode算法题05-最长回文子串

Leetcode原题为:

 题解为:

  1. class Solution:
  2. def longestPalindrome(self, s: str) -> str:
  3. size = len(s)
  4. # 特殊处理
  5. if size == 1:
  6. return s
  7. # 创建动态规划dynamic programing表
  8. dp = [[False for _ in range(size)] for _ in range(size)]
  9. # 初始长度为1,这样万一不存在回文,就返回第一个值(初始条件设置的时候一定要考虑输出)
  10. max_len = 1
  11. start = 0
  12. for j in range(1,size):
  13. for i in range(j):
  14. # 边界条件:
  15. # 只要头尾相等(s[i]==s[j])就能返回True
  16. if j-i<=2:
  17. if s[i]==s[j]:
  18. dp[i][j] = True
  19. cur_len = j-i+1
  20. # 状态转移方程
  21. # 当前dp[i][j]状态:头尾相等(s[i]==s[j])
  22. # 过去dp[i][j]状态:去掉头尾之后还是一个回文(dp[i+1][j-1] is True)
  23. else:
  24. if s[i]==s[j] and dp[i+1][j-1]:
  25. dp[i][j] = True
  26. cur_len = j-i+1
  27. # 出现回文更新输出
  28. if dp[i][j]:
  29. if cur_len > max_len:
  30. max_len = cur_len
  31. start = i
  32. return s[start:start+max_len]

好啦,这期的分享到这里结束啦!我们下期再见!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/468160
推荐阅读
相关标签
  

闽ICP备14008679号