CodingTour
ARTS #133

Algorithm

本周选择的算法题是:Combinations

规则

Given two integers n and k, return all possible combinations of k numbers out of the range [1, n].

You may return the answer in any order.

Example 1:

Input: n = 4, k = 2
Output:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

Example 2:

Input: n = 1, k = 1
Output: [[1]]

Constraints:

  • 1 <= n <= 20
  • 1 <= k <= n

Solution

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        if k == 0: return [[]]
        ans = []
        for i in range(k, n + 1):
            ans += [[i] + item for item in self.combine(i - 1, k - 1)]
        return ans

Review

What’s New in Flutter 2.8

有点钦佩 Flutter 团队,不断地在提高执行性能和生态建设。

Flutter 2.8 为 Windows、macOS、Linux 发布了稳定版本,似乎可以尝试将内部平台的前端页面用 Flutter 改写。

Tip

学习并实践了 python 的 metaclass,做了一个有趣的参数传递方案。

Share

一些设计原则

“让设计更简单”是稿定的使命,站在用户的角度思考问题,把这个思维做到极致,大概率是能做出好产品的。说来惭愧,我自己在生活中除了证件照外很少使用稿定,缺少对行业的洞察,大概率也是做不出好产品的。好坏之间有何区别呢?我觉着高性能的用户体验,是能提高品牌信誉的,“设计”可以是建立与终端用户持久信任关系的桥。

如何做出好产品呢?只要开始思考这些问题,就会发现众多不同的学科对“好”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则。

好的设计是简单的设计

简短的证明往往是更好的证明,当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。

好的设计是永不过时的设计

以永不过时作为目标能避免受到时代风潮的影响,“风潮”这个词,从字面上就可以看出,它就是一阵风似的,随着时间经常改变。如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。

好的设计是解决主要问题的设计

许多坏的设计做得很辛苦,但是从一开始方向就错了,答案可以不断改进,同样,问题本身也可以不断改进,软件开发的难题通常可以被改成等价的较易解决的形式。

好的设计是启发性的设计

论文有一个很有意思的指标,总体上可以把引用次数看作对他人启发性大小的粗略指标,如同软件开发,你应该为用户提供一些基本模块,使得他们可以随心所欲自由组合,就像玩乐高积木那样。

好的设计通常有点趣味性

幽默在一定程度上反映了力量,幽默感是强大的表现,始终拥有幽默感就代表你对厄运可以一笑了之,强大的标志就是可以轻松面对自己的人生。好的设计并非一定要有趣,但是很难想象完全无趣的设计会是好的设计。

好的设计是艰苦的设计

困难的问题需要艰巨的付出才能解决,如同高难度的数学证明需要结构非常精细的解决方法(它们做起来往往也很有趣),软件开发也是如此,解决难题带来的痛苦是值得的,但我们需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。

好的设计是看似容易的设计

很多领域的算法和解决方案在形式上往往很简单,全让人觉得自己也能想到,可是真的那么简单?在大多数领域,看上去容易的事情,背后都需要大量的练习,你一定听过一万小时定律,练习的目的是把刻意为之的事情变成一种自觉的行为,当面对难题时,它将唤起本能,释放出直觉的力量。

好的设计是对称的设计

对称是简洁的一种表现,世界上大量存在对称,这就说明了对称的重要性。短语、句子无不使用对称;美术、建筑、音乐无不使用对称;组件化、模块化无不使用对称;递归算法、甚至这个段落、这篇周报也使用了对称。

对称的危险之处在于它会取代思考,在大量使用重复元素的时候这种危险性更大。

好的设计能支持再设计

很少有人能一次就把事情做对,更好的做法是先完成一个早期原型,然后提出修改,最好再把早期原型扔掉。困难的地方在于必须有本事看出什么地方还可以改进,应该培养对自己的不满,不必把犯错看成灾难,只要勇于承认、勇于改正,犯错误是很正常的事情。开源软件敢于公开承认自己有 bug,反而使得代码的 bug 比较少。

好的设计常常是大胆的设计

好的设计还要有好的品味去识别出丑陋的东西,只有对这个领域非常熟悉,你才能发现哪些地方可以动手改进。只有在成为某个领域的专家之后,才会听到内心有个细微的声音说:“这样解决太糟糕了,一定有更好的选择。”不要忽视这种声音,要培育它们,优秀产品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。