写点什么

ARTS 打卡 第 1 周

用户头像
Scotty
关注
发布于: 2020 年 06 月 14 日

Algorithm 一道算法题;

Review 阅读并点评一篇英文文章;

Technique/Tips 是分享一个技术技巧;

Share 是分享一篇有观点和思考的技术文章。

Algorithm

leetcode-26 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

解题思路:

1.给定的数组是已经排好序的,这点很重要;所以,相同的元素一定会排列在一起。

2.题目要求不能使用额外的空间,所以要对数组元素做原地修改。

3.根据以上两点,需要创建两个索引,一个读取数组(读索引),一个修改数组(写索引)。

4.利用读索引遍历数组,若读取到的数字与写索引的值不同,则将写索引的下一个位置修改为读索引的值,直到遍历完毕。

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int vSize = nums.size();
if(vSize <= 1)
{
return vSize;
}
int write_idx = 0;
for(int read_idx = 1; read_idx < vSize ; ++read_idx)
{
if(nums[read_idx] != nums[write_idx])
{
nums[++write_idx] = nums[read_idx];
}
}
return write_idx+1;
}
};

Review

这次学习了这篇经典http://norvig.com/21-days.html#answers,这同时也是耗子叔推荐的文章。

这篇文章分析了为什么现在的人这么急功近利,只想用很短的时间,就掌握一门编程语言或是一项技能;作者明确的给出了答案:

 So the book can only be talking about a superficial familiarity, not a deep understanding.

很短的时间内,只能肤浅的熟悉,而不能深刻的理解。

那怎么样才能真正的成为编程专家呢,作者的答案是,长时间的刻意练习!

关于刻意练习,最有名的是同名书《刻意练习》,这本书的观点跟本文如出一辙:要想在编程或者其他方面成为专家,只看速成教程是不够的,需要长时间的实践,练习,反馈,根据结果不断调整。经过几年以后,才能有所成果,这也是本文的标题,花十年时间学习编程的由来。

这篇文章也被喻为自学编程的神文。



Tips

记录一下学习的计算机组成原理的知识:

局部性原理:

  • 我们不能既享受CPU Cache的速度,又享受内存、硬盘巨大的容量和低价呢?答案是可以,采用存储器中数据的局部性原理。

  • 时间局部性:如果一个数据被访问了,那么它在短时间内还会被再次访问。

  • 空间局部性:如果一个数据被访问了,那么和它相邻的数据也很快会被访问

利用局部性原理,我们在两个层级之间,加入缓存层,有效的提升数据的访问效率。



Share

分享一篇耗子叔的文章吧,https://coolshell.cn/articles/20793.html

关于CPU的缓存方面的知识讲述的相当通俗,后面的延伸阅读需要再画时间学习一下。

用户头像

Scotty

关注

我爱编程 Always Be Coding 2017.12.05 加入

11年程序员,4年java web全栈,7年服务端C++

评论

发布
暂无评论
ARTS打卡 第1周