ARTS 第 25 周

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


Contents:


Algorithm

14. Longest Common Prefix

题目:14. Longest Common Prefix

难度:Easy

题意:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

Input: ["flower","flow","flight"]
Output: "fl"

示例 2:

Input: ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

说明:

所有输入只包含小写字母 a-z 。

解法:

本题的解题思路比较直接,首先判断是否为空集,如果是空集,那么直接返回 ""。接下来选取第一个字符串作为参照字符串,其他字符串作为对比字符串,从第二个字符串开始,遍历每一个位置上的字母,如果出现索引位置超出对比字符串的长度,或者出现字母不相同的情况,那么说明之前比较过的位置上的字母都相同,则可以返回参照字符串的前 i 位。如果直到遍历结束也没有出现上述两种状况,说明字符串集合中所有字符串都一样,直接返回第一个字符串即可。

代码:

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""

        for i in range(len(strs[0])):    
            for each in strs[1:]:
                if i >= len(each) or each[i] != strs[0][i]:
                    return strs[0][:i]

        return strs[0]

时间复杂度 O(n),空间复杂度 O(1)。n 为字符串的个数。

在查看参考答案的过程中,有一个解法十分巧妙,它利用了 zip() 函数的特性和 python 中列表的乘法,将其解法分享给大家:

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        lcp = ""
        for s in zip(*strs):
            if (s[0],) * len(s) == s:
                lcp += s[0]
            else:
                break
        return lcp

时间复杂度 O(n),空间复杂度 O(1)。


Review

5G and the New Foundation of the Internet

本周阅读了一篇由 DailyIO 推荐的文章 5G and the New Foundation of the Internet,从「新型互联网」和「5G 会给互联网带来哪些变化」两个角度讲述了 5G 和互联网的新格局。

文章首先从作者对「苹果今年的新机 iPhone 11 系列不支持 5G」的看法引入,作者表示,即便是在中国,5G 网络仍然没有为苹果这家公司可能发布的大量 5G 设备做好准备,而苹果选择不在今年发布支持 5G 的手机是一个明智之举。

接下来作者谈到了 5G 和新型互联网之间的关系。5G 会让我们的智能手机更快,让我们享受到更高质量的视频和更低延迟的游戏体验,总体上让我们能更快地上网。但 5G 不仅仅是解决了当前无线网络的带宽问题,5G 是为更大的物联网设计的。这也是为什么作者认为 5G 是未来互联网的基础设施。

文章在接下来使用最多的篇幅描述了「5G 会给互联网带来哪些变化」,下面是作者的一些非常有趣且很真实的观点:

本文长句比较多,但内容翔实有趣,非常客观理性地分析了 5G 与未来互联网的新格局。作者的很多观点与吴军老师在得到 App 课程《前沿科技之吴军讲 5G》中的很多观点不谋而合,比如「5G 是否是伪需求」、「5G 的优势」和「5G 对未来互联网的影响」等等。此外,吴军老师的课程中涉及了更多的技术细节和商业上的分析,在此也一并推荐给大家。


Tips

vim 中的文件管理插件 NERDTree

vim 中由于没有默认的文件管理系统,所以在文件之间跳转经常会比较麻烦。这里推荐一个 vim 中的文件管理插件 NERDTree

使用 vim 插件管理器安装 NERDTree 之后就可以使用了,将下面一行写入 vimrc 中,即可通过按 F2 来打开文件管理目录:

nnoremap <silent> <F2> :NERDTreeToggle<CR>

使用 jk 来进行文件(夹)之间的切换,使用 o 或回车来打开文件或文件夹,使用 <C-w>-hjkl 来在窗口之间切换。


Share

聊聊最近看的一本书和一部科幻小说改编的电影

最近又看了一遍林达的《带一本书去巴黎》,依旧最喜欢其中的《安布瓦斯的古堡》。

书中有大量的历史场景和历史细节,作者尤其着墨于法国大革命,用这些场景和细节讲述了他们自己对于文学、历史、政治、艺术、文化、建筑、美学和社会的理解,也探寻了自由、民主、人性这些代表理性的东西是如何在与非理性之间的冲突中成为人类共有的现代理念的。也是从这本书里,我才渐渐意识到,现在看起来平和甚至有点儿“圣母”的欧洲,他们的历史也一样沉重和血腥。

但是重要的,是现代的人们如何去看待当年的事。我去过当年路易十六和安托瓦内特王后被砍头的协和广场,巴黎人或匆忙路过或安详踱步,明亮的阳光照射在方尖碑上,广场上空的鸽子成群结队地飞着,这一切也让人产生一些错觉,仿佛断头台从未存在过。

电影

周一的时候和实验室的墨西哥小哥 Antonio 讨论到思考时使用的语言对思路清晰程度的影响,我表示每当使用中文和英语/法语去思考某件事的时候,总感觉使用中文会纠结不清,但使用英语或者法语思考事情的时候,思路却比较容易变得清晰起来,小哥表示他也有类似的体验,但西语的熵并没有比法语大很多,甚至比英语还要小,所以这种对比并不强烈。当晚碰巧看了一部电影《降临》,本片改编自美籍华裔科幻作家 Ted Jiang(姜峯楠)的小说《你一生的故事》,小说篇幅不长,属于中篇小说,Ted Jiang 凭借这部作品获得了 2000 年的星云奖最佳中篇小说奖(星云奖相当于科幻界的诺贝尔文学奖)。

故事的梗概是,外星人七肢桶突然到访地球,作为语言学家的女主受命去与七肢桶沟通,终于掌握了外星人的语言,女主从此不仅能够清晰地看透自己的过去和现在,还能够预测未来。故事的这个设定基于 Sapir-Whorf 假说,也即 语言相对论

语言相对性原理(萨丕尔-沃夫假说)认为,不同语言里所包含的文化概念和分类会影响语言使用者对于现实世界的认知,也就是说不同的语言的使用者会因语言差异而产生思考方式,行为方式的不同。这个“语言结构影响语者认知结构”的说法涉及到人类语言学、心理学、语言心理学、神经语言学、认知科学、语言人类学、语言社会学、语言哲学等多个领域,并在这些领域中被广泛学习。

语言决定论认为语言决定思考模式。

不同语系的语言看待世界的方式都不一样,也就呈现了各种语言彼此间的相对性,所以任何民族的语言都与其文化和生活环境的需要而成长和改变。

这就与今天和小哥的聊天内容不谋而合了。

这本书还有另外一个让我思考的点。在故事的结尾,女主预见了一个会背叛自己的男人和一个注定会死去的女儿,即便如此,几年之后当男主向她求婚,女主还是选择了接受。「她像每个恋爱中的女孩一样,微笑着接受了对方,去开始一段注定会分离的感情,去孕育一个早逝的生命,去落实一系列不可逃避的悲剧命运。」这让结尾看起来像是一个悲剧。

历史上有名的哲学家,几乎没有不被「决定论」和「意志自由论」困扰的,就像叔本华就认为「人是受到因果支配的,人是不自由的」。历史故事中也有诸如宙斯弑父和俄狄浦斯杀父娶母的故事。Ted Jiang 在这本书中针对这个问题给出了自己的答案:如果你已经知道自己的无法改变的命运,你是否仅仅是一个傀儡呢?还有没有必要再去经历一遍这样的命运呢?作者的答案是:是的,有必要,因为仅仅是「预知」,不能代表「经历」,就像婚礼上每个人都知道会有那句「我宣布你们二人结为夫妻」,但这仅仅只是「预知」,只有在主持人宣布这句话的时候,它才会成为一个「经历」或者「事实」。

爱情是这样,明知会失去,会受伤,但是还是义无反顾地去爱了,也许会后悔,也许就像阿信唱的会「欠了她一生的一句抱歉」;生活大抵也是这样,不然何来「欲渡黄河冰塞川,将登太行雪满山」,何来「莫听穿林打叶声,何妨吟啸且徐行」,何来「更喜岷山千里雪,三军过后尽开颜」?

在这部电影或者这本书里,作者想告诉我们的是,未来就像一个车轮,会不可抗拒的向我们碾压过来,无论是喜是悲,我们都应该积极地去面对,去拥抱生活,这样,人才能从决定论的束缚中获得意志的自由。