每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
在有序数组中移除重复元素
题目:26. Remove Duplicates from Sorted Array
难度:Easy
题意:给定一个有序数组 nums
,原地 移除重复元素,每个元素在新数组中只出现 一次。要求不能给另一个数组分配额外的内存空间,所以必须以 O(1) 的空间复杂度 原地更改 输入数组。
例子 1:
Given nums = [1,1,2],
Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
It doesn't matter what you leave beyond the returned length.
例子 2:
Given nums = [0,0,1,1,1,2,2,3,3,4],
Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.
It doesn't matter what values are set beyond the returned length.
解法:
这道题想明白了其实非常简单,因为不能申请额外的空间,所以需要直接修改原数组。题意是去除重复的元素,那么一定要遍历数组,发现重复的话,就把后面的元素往前移,覆盖掉前面重复的元素。具体实现应该是指定两个指针,一个慢指针指向第一个元素,快指针指向第二个元素,快指针一直判断自己所在位置的元素是不是和慢指针所在的元素相同,若相同则快指针后移,若不同则将快指针所在位置的元素赋值给慢指针后面的元素,慢指针再后移一位。最后慢指针指向的元素和之前的所有元素都不是重复的。
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0
for i in range(1, len(nums)):
if nums[count] != nums[i]:
count += 1
nums[count] = nums[i]
return count+1
时间复杂度 O(N),空间复杂度 O(1)。
另外,自己看了一些大牛关于如何刷题的技巧,有一点还是比较同意的,即:第一遍刷题的时候应该直接看答案,因为我们:
这样就导致我们刷题的速度和质量非常的慢,所以应该第一遍刷题的时候直接看答案,第二遍再来慢慢思考巩固从答案中总结出来的知识和技巧。
The AI for augmenting yourself
这周选的文章是 Medium 上面关于“虚拟世界中的真实人物”的一篇文章。
作者在文中解释了互联网世界中我们的虚拟人物(digital profiles)是如何被建立起来的:
我们生活在过去,我们所有的人物画像都存储在过时的数据格式中,这些格式与几十年前没有太大差别。但是现在人工智能通过我们喜欢的社交媒体、我们的购买记录、我们与世界的互动方式等数据来强化自己,我们可以将认知能力赋予我们的虚拟人物。
现在想象一下,我们的虚拟人物能够说话,思考,选择,执行我们特有的某些行为。从在线个性模式中诞生的虚拟人物件直接与我们相关。我们的第二个身份生活在虚拟世界中,这是一个增强的世界,我们的3D智能虚拟人物具有我们的个性,我们知道它是可信赖的代表,就像我们喜欢的一切。我们将有无限的可能性在数字空间的任何地方使用我们的虚拟人物。而最奇妙的是,这将是一个巨大的用途,我们的世界将一劳永逸地改变。
作者在这之后还展示了人工智能的各种可能性,表达了自己对这一新技术的关注和期待,作者对人工智能有着非常积极的态度。
个人观点:
本以为西方世界中大多数人民应该对人工智能这一产物有着更高的认知,但是这篇积极正面的文章以及下面很多正面的评论却让我感到一种隐隐的不安。我想到各大公司不断爆出的个人隐私的泄露和滥用(可笑的是我在搜索这篇文章的时候,点今卫报的网站,然后快速的点击了接受 Cookies 🙂),我想到很多电影小说中的超出人类掌控的智能体(黑客帝国、银翼杀手),我想到卡辛斯基的警告和霍金等人的人工智能威胁论,也想到尤瓦尔·赫拉利提到的吉尔伽美什计划。也许我们对数据和人工智能的使用,应该放缓一些?在这一方面,也许欧盟的 GDPR 做的不错。
这周的 Tip 我觉得还蛮有必要把它写成一个单独的文章,步骤比较多,就放在 Share 部分了。关于如何配置自己的 iTerm2 的外观。
结果: