楼主: Myron2017
跳转到指定楼层
上一主题 下一主题
收起左侧

刷题记录帖子

🔗
 楼主| Myron2017 2020-4-8 05:29:12 | 只看该作者
全局:
292. Nim Game 特别简单的题目,想清楚这个策略是怎么 work 的就可以,其实最关键的部分就是 每 4 个石头是一组。
答案一旦想清楚就特别简单。

回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-8 05:43:24 | 只看该作者
全局:
本帖最后由 Myron2017 于 2020-4-8 05:52 编辑

701. Insert into a Binary Search Tree 树的基本操作,两种写法都应该掌握,
这道题目的 recursion 更加巧妙值得自习品味。如何借助 None 返回新的 节点而不需要显式生成 TreeNode
Iterative methods


  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. #     def __init__(self, x):
  4. #         self.val = x
  5. #         self.left = None
  6. #         self.right = None

  7. class Solution:
  8.     def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
  9.         if root is None:
  10.             root.val = val
  11.             return root
  12.         node = root
  13.         prev_node = root
  14.         while node:
  15.             if node.val < val:
  16.                 prev_node = node
  17.                 node = node.right
  18.             else:
  19.                 prev_node = node
  20.                 node = node.left
  21.         new_node = TreeNode(val)
  22.         if prev_node.val < val:
  23.             prev_node.right = new_node
  24.         else:
  25.             prev_node.left = new_node
  26.         return root
复制代码


  1. # Definition for a binary tree node.
  2. # class TreeNode:
  3. #     def __init__(self, x):
  4. #         self.val = x
  5. #         self.left = None
  6. #         self.right = None

  7. class Solution:
  8.     def insertIntoBST(self, root: TreeNode, val: int) -> TreeNode:
  9.         if root:
  10.             if root.val > val:
  11.                 root.left = self.insertIntoBST(root.left, val)
  12.             if root.val < val:
  13.                 root.right = self.insertIntoBST(root.right,val)
  14.             return root
  15.         else:
  16.             return TreeNode(val)
复制代码


回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-8 10:07:39 | 只看该作者
全局:
本帖最后由 Myron2017 于 2020-4-8 10:09 编辑

535. Encode and Decode TinyURL 这道题目其实很简单,并不是特别难.
但是确实入门 system design 的好题目,这里的很多观点和思路都非常好,适合转移到 system design 的思路里面。
比如我们如何设计 key,如何 id。当然在刷题阶段,这道题目过了就行,心里记住 system design 的很多原则和思路即可。
当然如何记住几个 Python 的惯用法也是很有用的,比如

letters = string.ascii_letters + string.digits
res += letters[random.randint(0,61)]


  1. class Codec:
  2.     def encode(self, longUrl: str) -> str:
  3.         """Encodes a URL to a shortened URL.
  4.         """
  5.         import string
  6.         import random
  7.         self.URLtable = {}
  8.         letters = string.ascii_letters + string.digits
  9.         suffix = "http://tinyurl.com/"
  10.         def rand6letters() -> str:
  11.             res = ""
  12.             for i in range(6):
  13.                 res += letters[random.randint(0,61)]
  14.             return res
  15.         tmp = rand6letters()
  16.         while True:
  17.             if tmp not in self.URLtable:
  18.                 self.URLtable[tmp] = longUrl
  19.                 break
  20.             else:
  21.                 tmp = rand6letters()
  22.         return suffix+tmp
  23.             

  24.     def decode(self, shortUrl: str) -> str:
  25.         """Decodes a shortened URL to its original URL.
  26.         """
  27.         key = shortUrl.split('/')[-1]
  28.         return self.URLtable[key]

  29. # Your Codec object will be instantiated and called as such:
  30. # codec = Codec()
  31. # codec.decode(codec.encode(url))
复制代码


回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-8 23:05:54 | 只看该作者
全局:
876. Middle of the Linked List  之前做过,还是 slow fast pointer 解决。当然需要注意指针不能越界。

回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-11 03:42:06 | 只看该作者
全局:
155. Min Stack 这道题目还是挺好的,关键思路就是一个,需要记录下当前值,插入时候的 min value。 通过记录信息解决问题。

两种思路,一个是 two stack, 一个记录 x, 一个记录 current x‘s min; 另一个就是直接存 tuple。

回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-12 06:18:35 | 只看该作者
全局:
543. Diameter of Binary Tree 很经典的题目。如何在递归中利用 tree 的特性解决 图的内部问题。
这里最重要的设计出题目要求的答案,总共三种可能的 case 存在 最大的 diameter。
(1) 在左子树中
(2) 在右子树中
(3) 在经过 root 连接了左右子树的路径中

所以题目借助一个 辅助函数然后,不断调用递归即可 dfs。



  1. class Solution:
  2.     def diameterOfBinaryTree(self, root: TreeNode) -> int:
  3.         
  4.         self.res = 0
  5.         
  6.         def helper(root: TreeNode) -> int:
  7.             if not root:
  8.                 return 0
  9.             depth_left = helper(root.left)
  10.             depth_right = helper(root.right)
  11.             # if the path cross root
  12.             self.res = max(self.res, depth_left + depth_right)
  13.             return 1+max(depth_left, depth_right)
  14.         helper(root)
  15.         return self.res
复制代码
回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-12 10:56:02 | 只看该作者
全局:
6. ZigZag Conversion 其实就是 一个 从 0 ~ num-1 在回到 0 的数字循环插入数字。

但是题目非常误导人,如果读不懂题意就栽了。所以还是多多提高理解能力。
同时一个知识点,如何实现 0 ~ N ~ 0 的方法,我是用 mod 来做,但是看答案看到这么一个更加高效的方法,记录下。
通过改变 step 来做,直接从 +1 到 -1 高明~!


  1. class Solution:
  2.     def convert(self, S: str, R: int) -> str:
  3.         if R == 1 or R > len(S):  # corner case
  4.             return S
  5.         res, i, step = ['' for r in range(R)], 0, 0  # a string for each line
  6.         for s in S:
  7.             res[i] += s
  8.             if i == 0:  # first row
  9.                 step = 1  # down
  10.             if i == R - 1:  # last row
  11.                 step = -1  # up
  12.             i += step
  13.         return "".join(res)
复制代码
[/i]
回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-13 00:05:05 | 只看该作者
全局:
1046. Last Stone Weight 还是很简单的题目,我是通过排序做的,不过参考了下别人的答案还可以用 heap ,还是数据结构解决问题的思路。

记录下 Python 如何使用 heap, import heapq


  1. import heapq class Solution:
  2.      def lastStoneWeight(self, stones: List[int]) -> int:
  3.          stones = [-val for val in stones]
  4.          heapq.heapify(stones)
  5.          while len(stones) > 1:
  6.              x1 = heapq.heappop(stones)
  7.              x2 = heapq.heappop(stones)
  8.              if x1 != x2:
  9.                  heapq.heappush(stones,-abs(x1-x2))
  10.          if len(stones) == 0:
  11.              return 0
  12.          return -stones[0]
复制代码


回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-15 08:30:50 | 只看该作者
全局:
今天刷了一道新的 30 天测试题,还是很 简单的,其实就是先统计左移总次数再统计右移总次数,最后得到 net shifts,再根据 reminder of modulo 得到具体的移动距离,最后组合字符串,不过这里需要小心。首先 Python 取字符串并不会取 s[a:b] 其实是取 s[a] 到 s[b-1] 所以需要注意。
回复

使用道具 举报

🔗
 楼主| Myron2017 2020-4-16 05:16:43 | 只看该作者
全局:
238. Product of Array Except Self 每日签到题目,还是比较容易的,非常经典,其实就是不用除法,然后通过两边遍历得到左边数字乘积和右边数字乘积。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表