正文
ARTS 第 4 周
每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
Contents:
- Algorithm: LeetCode 80. Remove Duplicates from Sorted Array II
- Review: I wanna be a data scientist, but… how!?
- Tip: 在 Chrome 上开启并行下载
- Share: 朋友的观点
Algorithm
80. Remove Duplicates from Sorted Array II
难度:Easy
题意:给定一个有序数组 nums,原地 移除重复元素,每个元素在新数组中只出现 两次。要求不能给另一个数组分配额外的内存空间,所以必须以 O(1) 的空间复杂度 原地更改 输入数组。
例子 1:
Given nums = [1,1,1,2,2,3],
Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively.
It doesn't matter what you leave beyond the returned length.
例子 2:
Given nums = [0,0,1,1,1,1,2,3,3],
Your function should return length = 7, with the first seven elements of nums being modified to 0, 0, 1, 1, 2, 3 and 3 respectively.
It doesn't matter what values are set beyond the returned length.
解法: 本题和之前的第 26 题基本一样,只是在细节上有一点不同,也是使用双指针法来解。指定两个指针,慢指针指向第 2 个元素,快指针指向第 2 个元素。这里注意到这个数组是有序的,所以从[慢指针-2位置]开始到[慢指针-1位置],这两个位置的元素不论是否相同,都是符合题意要求的,快指针一直判断自己所在位置的元素是不是和[慢指针位置-2]所在的元素相同:若相同,快指针后移,若不同,把快指针所在位置的元素赋给慢指针所在的元素,快慢指针均后移。
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 2
for i in range(2, len(nums)):
if nums[count-2] != nums[i]:
nums[count] = nums[i]
count += 1
return count
时间复杂度 O(N),空间复杂度 O(1)。
Review
I wanna be a data scientist, but… how!?
这周选的文章是 Medium 上面的一篇讲述「如何一步一步成为一个数据科学家」的文章。
作者在文章开头用一张「地铁图」展示了数据科学的众多工作技能之间的关联。

作者列举了数据科学领域经常出现的一些技能:
- 线性代数、微积分、概率论和统计学(数学)
- Python 或者 R 的编程技能以及与数据科学相关的标准库
- SQL 的知识
- 获取数据的能力(API、网页爬虫)
- 数据清洗和预处理(以及有名的特征工程)
- 机器学习(算法、建模、评价、优化等等)
- 深度学习、强化学习、自然语言处理、计算机视觉……
以及:
- 可视化结果以对其进行解释
- 讲故事的能力
- 制定问题和准备/测试假设
- 领域里的其他知识
- ……
作者说,其实这些附加技能(soft-skills)才能真正将你与其他人区分开来。另外,作者还列举回答了几个问题:
我需要一个硕士学位吗? 不是必须。网络上有足够的信息能让你变成一个大牛。
但是公司在寻找一些经过额外训练和认证的人才… 重要的是展示你的知识,而非头衔。技术面试官会评估你关于所需知识的掌握程度,你要做的就是向他们证明你就是他们要找的人。
作者接下来介绍了学习成为一个数据科学家的路径:
- 在 Python 和 R 之间做一个选择(建议 Python 如果你之前没有学过 R 的话)
- 学习语言的基础知识,慢慢扩展,另外关注 Git、GitHub 和 Jupyter,这些是你日后每天都要用到的工具
- 了解常用的数据科学库
- 机器学习!
- 深度学习、强化学习和公司
- 参与 Kaggle 的竞赛
- 最重要的技巧:做项目
- 准备面试
一些技巧:
- Learn by doing
- 组织好时间表
- 像要去教给别人一样去学习
- 使用从上至下的方式:直接去学习机器学习,在需要的时候再学习对应的数学部分。这样可以不失去动力。
- 学会寻找资源
- 将项目同步到 GitHub 上
- 不要被各种推送信息淹没
- 好好准备面试
最后一个技巧:这个旅途很长,所以尽可能地把它看成一个半程马拉松,而不是一个竞速跑。
Tip
在 Chrome 上开启并行下载
Chrome 是自带并行下载功能的,开启方式如下:
在地址栏输入 chrome://flags/,然后在搜索框中输入 Parallel downloading,选择 enabled,重启 Chrome 即可。

Share
最近在思考读博士和做事情的意义。看到一位朋友在朋友圈中的分享,觉得非常有感触,摘录如下:
作为一个正在读博的告诉你,读博的人每个人都有每个人的打算,但是有一点是肯定的,如果你不想去高校当老师的话,那么读博的过程一定不是你想象中的那样。前两天看王耀林发了一句话,这辈子越晚接触那些牛逼闪闪的人,这辈子可能越幸福。现在无比赞同。我觉得每个人最终干什么可以成功一定是他的性格和这个事情所需要的相匹配。不匹配的话再努力都不太可能成功。一个人做事不心狠手辣不在斗争中鱼死网破他做不到顶尖的位置,大多数人只看到了他坐在顶尖的位置,却没看到自己的性格与他性格之间的不同。大家只是想成为他那样的人,可先不说自己适不适合朝那个方向努力,就算做到了那,逼自己变成那个样子值不值得自己是要好好考量一下的。
朋友的这段话有一些我比较赞同,有一些我则有自己的观点:
- 「越晚接触那些牛逼闪闪的人,这辈子可能越幸福」。采铜在他的《精进》一书中提到,根据人们对过去、现在和未来的不同态度,即「时间视角」,可以将人们划分成五种人:「积极过去」、「消极过去」、「享乐主义」、「宿命论」和「未来视角」。「享乐主义者」在某种程度上是非常幸福的,村上的「小确幸」也提出了类似的观点,越晚接触更牛逼的人,你可能越会在意眼前和当下的事情,生活得越充实。而我本人其实属于「未来视角」,总是更关注待完成的目标和任务,为了完成这些目标和任务,我愿意牺牲当下的享乐,有的时候甚至到了焦虑的程度,这就导致了我日常生活中的幸福感并不高。另外一个例证是,每次回国,在生活了十几年的小城市里,我能明显感觉到极高的幸福感,不用去想以后的职业发展方向、需要学习的技能能力等等,只要早早出门去吃喜欢的早餐,每天的幸福感就会非常的高了。但是一回到原来的生活状态,就会开始习惯性焦虑。也许需要综合考虑,不要维持单一的时间视角,随需而变,这辈子才会越幸福吧。
- 「我觉得每个人最终干什么可以成功一定是他的性格和这个事情所需要的相匹配」。这一点我非常赞同。我们需要了解自己,关照自己的内心,也许 才能知道自己想要什么,需要付出什么样的代价,能不能承受这样的代价,想明白了之后再用这个终极目标去指引日常生活,这样每一年、每个月、每一天都能过得充实,也许人生的意义也就慢慢清晰了。