Algorithm
本周选择的算法题是:132 Pattern。
规则
Given an array of n
integers nums
, a 132 pattern is a subsequence of three integers nums[i]
, nums[j]
and nums[k]
such that i < j < k
and nums[i] < nums[k] < nums[j]
.
Return true
if there is a 132 pattern in nums
, otherwise, return false
.
Example 1:
Input: nums = [1,2,3,4]
Output: false
Explanation: There is no 132 pattern in the sequence.
Example 2:
Input: nums = [3,1,4,2]
Output: true
Explanation: There is a 132 pattern in the sequence: [1, 4, 2].
Example 3:
Input: nums = [-1,3,2,0]
Output: true
Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].
Constraints:
n == nums.length
1 <= n <= 2 * 105
-109 <= nums[i] <= 109
Solution
class Solution:
def find132pattern(self, nums: List[int]) -> bool:
if len(nums) < 3: return False
stack, maxmid = [], float('-inf')
for n in nums[::-1]:
if n < maxmid: return True
while stack and stack[-1] < n:
maxmid = stack.pop()
stack.append(n)
return False
Review
Deep dive into Electron’s main and renderer processes
主要分三部分:
- 主进程的职责
- 渲染进程的职责
- 它们之间如何通信
主进程负责管理 BrowserWindow 实例和应用事件,还负责注册全局热键、创建菜单等工作,另外应用入口的 JS 文件也是在主进程内执行的,显然主进程不适合做太多计算密集型的工作。
Electron 是基于 Chromium 和 Node.js 构建 App 的,这意味着 Chromium 原生的设计也会被带到 Electron 里,比如在 Chromium 里每一个 tab 或 web 页面都是 webContents 的实例,所有的 DOM APIs、Node.js APIs、Electron APIs 都可用于渲染进程,如下图所示:
如何确定主进程和渲染进程的边界?Electron 在文档明确提到过,如果一个模块是 GUI 模块,或者需要和系统进行 low-level 层面的通信,那么只应该在主进程内执行,这里的 GUI 指 Native 的 GUI 界面,而不是指 Chromium 呈现的基于 HTML 的 UI。
渲染进程的创建时机也和主进程不同,渲染进程是直到 window 有一个 webContents 实例时才会创建。
两者的通信方式和 Chromium 一样,它们在进程间使用 ipc 通信,具体的说是 Named pipe,与常规管道不同,Named pipe 有如下特点:
- 除了直系关系的进程,还可用于非亲属关系的进程间通信
- 会以文件的形式存放在文件系统上,并保证 FIFO 的消费顺序
- 虽然看起来是一个实体文件,但实质上只是磁盘上的一个节点,具体的数据存放在内存缓冲里,和常规管道一样
之所以不用网络协议通信,显然是因为管道通信效率更高、更安全。
Tip
尝试用平衡计分卡描述战略、技术价值与业务价值之间的关系,作为 OKR 工具的补充确实还不错。
Share
推荐几本书吧:
- 解析极限编程 - XP 是一条可以使得一起开发的人们共同进步直至卓越的途径
- 持续交付 - 自动化验收测试限于完全覆盖 happy path 的行为,并仅覆盖其他一些极其重要的部分
- Remote - 时间和自由是新的奢侈品
- 人月神话 - 所有的编程人员都是乐观主义者
- Getting Real - 不用担心被盗版,重要的是让更多的人去感受
- 数据密集型应用系统设计 - 排列磁盘结构从而提高检索效率
- SRE : Google运维解密 - 实现是短暂的,但记录在案的推导过程是无价的
- 微服务设计 - 细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜
每本书都反映了作者的价值观和经验,在职业生涯中,我们总是会遇到深刻影响我们思考和工作方式的书籍,一起成长吧。