Algorithm
本周选择的算法题是:Range Sum Query - Immutable
规则如下:
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
Note:
- You may assume that the array does not change.
- 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
- 删除不必要的功能
- 避免不必要的步骤
- 尽可能早的 break 循环
- 尽可能的预先计算(防止重复做相同的事情)
- 代码顺序可能影响代码执行的性能
- 学习时间、空间复杂度的计算方式
- 尽量使用内建的方法
- 为你的功能采用合适的数据对象
- 不要忽略内存管理
- 尽可能使用单条语句
- 避免使用 delete 关键字
- 使用异步编程防止线程堵塞
- 组件化的设计,将代码分散到不同的组件中
Tip
Python 中简便的数值比较:
3 > x > 1
在 macOS 上快速访问 Emoji 菜单的快捷键:
control + command + space
Share
结对编程的优势和挑战
优势
知识共享
开发人员之间的知识共享对代码仓库保持白盒有很大作用,不会出现只有唯一程序员才能修复的问题出现
两个脑子比一个好
两个人同时思考一个问题时,大家的经验、解决问题的能力都得到了至少1倍的增长,这对处理复杂问题时尤为有效
减少代码错误
2对眼睛看着代码,代码中的错误应该得到显著的控制,这就好像是在实时 reviews
保证开发进度
精力更加集中,毕竟观察员看着你呢
挑战
两个开发者都必须参与进来
如果大家的目标不一致,那么结对编程不会有任何收益
潜在成本
两个人共同工作在同一段代码上,虽然代码质量提高了、技术债、返工减少了,但是初期的成本还是很明显的
沟通
观察员和驾驶员应该保持沟通、发表各自的意见和决策,而不是沉默,沟通不足会使结对编程的优势大幅降低
你不能强迫大家进行结对编程
这是最重要的,至少观察员和驾驶员的关系要好
常见的配对方式
经验 | 效果 |
---|---|
两位有经验的程序员 | 能够取得很好的结果,不过经验丰富的人不太可能做出创新式的解决方案 |
有经验+缺少经验 | 这种组合可能会产生很多新想法(前提是缺少经验的人也要能勇于表达自己的看法) |
两个都缺少经验 | 可以显著改善一段代码,但这不是首选方案,因为很难找到一个好的解决方案 |