CodingTour
ARTS #153

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运维解密 - 实现是短暂的,但记录在案的推导过程是无价的
  • 微服务设计 - 细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞膜

每本书都反映了作者的价值观和经验,在职业生涯中,我们总是会遇到深刻影响我们思考和工作方式的书籍,一起成长吧。