每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章

题图:macOS Bir Sur Wallpaper

Contents

Algorithm

204. Count Primes

题目:204. Count Primes

难度:Easy

题意:Count the number of prime numbers less than a non-negative number, n.

示例 1:

Input: n = 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.

示例 2:

Input: n = 0
Output: 0

示例 3:

Input: n = 1
Output: 0

Constraints:

解法:

这道题最粗暴的解法就是遍历小于 n 的所有数字,判断其是否为质数,然后计数即可,但题中给出的限制条件中提到,n 可以取到 5 * 10^6,如果使用这种解法,效率势必会很低。

我们想到,找质数很难,但找合数却相对简单,只要是遍历到的数字,它的倍数就一定是合数,那么我们找到所有的合数,也就找到了剩下的质数了。

这一题的实现方式也比较取巧:我们构造一个 n 大小的数组用以标记每个数是否为质数,遍历小于 n 的数字,如果这个数没有被遍历过,将其标记为质数(True),并将它的小于 n 的所有的倍数标记为非质数(False)。这样遍历完成之后,我们就将所有的数字都进行了标记,最后只需要返回之前构造的数组的 sum 即可。

代码:

class Solution:
    def countPrimes(self, n: int) -> int:
        if n <= 1:
            return 0

        nums = [None] * n
        nums[0], nums[1] = False, False
        
        for i in range(n):
            if nums[i] is None:
                nums[i] = True
                for j in range(2*i, n, i):
                    nums[j] = False
        
        return sum(nums)

Result:

Accepted
- 20/20 cases passed (712 ms)
- Your runtime beats 45.6 % of python3 submissions
- Your memory usage beats 49.6 % of python3 submissions (25.7 MB)

这道题其实比较复杂,用到了两个 for 循环,所以时间复杂度也比较高,同时也使用了一个数组,空间复杂度为 $O(N)$。代码实现的时候,注意在写第二个 for 循环时,interval 使用的是 i,这样自然地就标记了 i 的倍数。

Review

Tim Ferriss Is No Longer Living the Tim Ferriss Lifestyle. Neither Should You

本周的文章来自 Medium 的推送《Tim Ferriss Is No Longer Living the Tim Ferriss Lifestyle. Neither Should You》。

作者在文章中对 Tim Ferriss 在《4-hour Workweek》一书中多次强调并一直践行的「时间、工作和生活优化理论」提出了异议和反驳。作者表示,重要的是自身的感受,而非外界环境是否经过优化,你应该关注内心真正想要的东西。

As Ferriss now says, “Not everything that is meaningful can be measured.”

作者在文章结尾说道:

Especially to the question, “What makes you happy?”

For a few goals, the answer might be efficiency, productivity, and optimization. For a few others, the answer might be personal fulfillment, meaning, and gratification.

For most goals, the answer will be a combination of all those factors.

And the only right answer will be your answer.

Because only you can decide what will make you happy.

希望这篇文章能帮助自己和大家摈除外界的干扰,关注自己内心最想要的东西。

Tips

GitHub 个人主页与 Metrics

GitHub 提供了一个个人主页的设置选项,创建一个与你的 GitHub 账号同名的仓库后,在这个仓库中的 readme.md 的内容会被展示在你的 GitHub 主页上,就像下面这样:

我的 GitHub 主页

我使用了一个叫做 Metrics 的开源项目实现了上面展示的效果。这个项目将你的 GitHub 的各个指标展示在一个 svg 图片中,你可以把这个图片放在你的 GitHub 主页或者其他地方。使用插件与模板,你甚至可以播放音乐、连接推特、展示自己的编码习惯等等。

My Metrics

你可以访问 metrics.lecoq.io 来自定义你的 metrics 图片。

Share

分享一个记录编码时间的 IDE 小插件——WakaTime

本周和大家分享一个记录编码时间的 IDE 小插件,叫做「WakaTime」。

这是一个用来记录自己的编码时间的小工具,基本上市面上常见的 IDE 都支持安装。

WakaTime on VS Code

WakaTime On PyCharm

WakaTime 提供了一个时间统计的 Dashboard,你可以在这个 Dashboard 里追踪你的编码时间,编程习惯,不同项目、不同 IDE 编程的分布时间等等。你甚至可以使用 waka-readme 这个开源项目将你的 Daily Metrics 分享到上文提到的 GitHub Profile Readme 中。

WakaTime Dashboard

WeChat QRCode