CodingTour
ARTS #13

Algorithm

本周选择的算法题是:Range Sum Query - Immutable

规则如下:

Given an integer array nums, find the sum of the elements between indices i and j (ij), inclusive.

Example:

Given nums = [-2, 0, 3, -5, 2, -1]

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

Note:

  1. You may assume that the array does not change.
  2. There are many calls to sumRange function.

Solution

我实现的方案:

Runtime:112 ms,快过 28.49%。

Memory:17.5 MB,低于 10.00%。

class NumArray:

    def __init__(self, nums: List[int]):
        self.cummulative = []
        sum = 0
        for num in nums:
            sum += num
            self.cummulative.append(sum)
        
    def sumRange(self, i: int, j: int) -> int:
        if i == 0:
            return self.cummulative[j]
        else:
            return self.cummulative[j] - self.cummulative[i - 1]

Review

13 Tips to Write Faster, Better-Optimized JavaScript

  1. 删除不必要的功能
  2. 避免不必要的步骤
  3. 尽可能早的 break 循环
  4. 尽可能的预先计算(防止重复做相同的事情)
  5. 代码顺序可能影响代码执行的性能
  6. 学习时间、空间复杂度的计算方式
  7. 尽量使用内建的方法
  8. 为你的功能采用合适的数据对象
  9. 不要忽略内存管理
  10. 尽可能使用单条语句
  11. 避免使用 delete 关键字
  12. 使用异步编程防止线程堵塞
  13. 组件化的设计,将代码分散到不同的组件中

Tip

Python 中简便的数值比较:

3 > x > 1

在 macOS 上快速访问 Emoji 菜单的快捷键:

control + command + space

Share

结对编程的优势和挑战

优势

知识共享

开发人员之间的知识共享对代码仓库保持白盒有很大作用,不会出现只有唯一程序员才能修复的问题出现

两个脑子比一个好

两个人同时思考一个问题时,大家的经验、解决问题的能力都得到了至少1倍的增长,这对处理复杂问题时尤为有效

减少代码错误

2对眼睛看着代码,代码中的错误应该得到显著的控制,这就好像是在实时 reviews

保证开发进度

精力更加集中,毕竟观察员看着你呢

挑战

两个开发者都必须参与进来

如果大家的目标不一致,那么结对编程不会有任何收益

潜在成本

两个人共同工作在同一段代码上,虽然代码质量提高了、技术债、返工减少了,但是初期的成本还是很明显的

沟通

观察员和驾驶员应该保持沟通、发表各自的意见和决策,而不是沉默,沟通不足会使结对编程的优势大幅降低

你不能强迫大家进行结对编程

这是最重要的,至少观察员和驾驶员的关系要好

常见的配对方式

经验效果
两位有经验的程序员能够取得很好的结果,不过经验丰富的人不太可能做出创新式的解决方案
有经验+缺少经验这种组合可能会产生很多新想法(前提是缺少经验的人也要能勇于表达自己的看法)
两个都缺少经验可以显著改善一段代码,但这不是首选方案,因为很难找到一个好的解决方案