ARTS-第-25-期_静态资源

阅读本文大概需要 8 分钟。

每周完成一个 ARTS

Algorithm 来源 LeetCode 402. Remove K Digits。 Review 分享几种优化 web 页面加载速度的策略。

Tip 分享一道面试题说明笔试的陷阱。

Share 关于如何分配时间和收入的一些思考。

PS:由于公众号不支持添加外链,所以大家遇到有链接的地方滑到文章最下面点击阅读原文就可以访问了哈,如果觉得文章不错,欢迎分享给周围的朋友们哈

ARTS-第-25-期_静态资源_02

1.Algorithm

LeetCode 402. Remove K Digits 难度:[Medium]

【题意】

给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数.找到删除 k 个数字之后的最小正整数。

Example 1:

Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

【思路】

拿到这道题,我们会下意识的去思考如何按顺序去删除数字,使得剩下的数字最小,我们不妨换一种思路,不从正面的角度去思考,而是从反面的角度去切入,要删除 k 位,那么自然要留下 n-k 位,想到这一点了之后这道题就不难了。
首先要存入每一位数字,并且要注意,如果第 i 位数字大于 i+1 位,那么应该删除第 i 位数字。
最后我们要记得去掉前面的多余0。

【解法一】(C++)

/*
Author: https://github.com/rongweihe
Time: 2019-04-07
*/
// Time complexity : O(n).
// Space complexity : O(1).
class Solution {
public:
string removeKdigits(string num, int k) {
string res = "";
int len = num.size();
int keep = len-k;///删除 k 位,那么要留下 n-k 位
for(char c:num)
{
while( k && res.size() && res.back() > c) ///如果i位数字大于i+1位,那么删除i位数字
{
res.pop_back();
--k;
}
res.push_back(c);///存入每一位
}
res.resize(keep);///最后我们将res的大小重设为n-k
while(!res.empty() && res[0] == '0') res.erase(res.begin());///去掉前面的多余0
return res.empty()?"0":res;
}
};

2.Review


介绍几种优化web页面加载速度的策略。

1. 剥离静态资源请求到CDN

一般在主域名下的 HTTP 请求里都会携带大量 Cookie 信息,最大 4KB,每个域名下最多 50条;但如果仅仅访问 js/css/jpeg 等静态资源文件的话是不需要 Cookie 信息,所以可以将整个站点的静态资源放到一个专门的域名下,以求减小网络开销,也就是 Cookie free domain;

2. 多域名存储资源

浏览器在对同一个域名下的并发请求资源数量是有上限的,一个完整的 html 页面需要加载的资源一般已经超过某个数量值,所以为了缩短加载速度可以将下载资源分布在多个域名下(也不能太多,DNS 查询也需要耗时);这样不仅可以增加资源加载的并发数,还可以实现静态资源Cookie Free 加载。

3. 合并HTTP请求

加速网页加载不仅需要加快单个请求速度的同时,还需要减少总的请求个数。css spirites 可以将多张图片合并成一张图片,这样只需要一次请求,不同 css 展示图片上不同的位置;通过使用smartspirites 命令在打包的时候讲图片合并成一张图片。

另外的几个还有

压缩请求资源 ,合理利用浏览器 cache ,使用静态页面 。感兴趣的可以可以查阅相关资料,这里就不详细讲解了。

3. Tip

分享一道常见的面试题

受到这篇文章的启发:卓越的教练是如何训练高手的?

题目:手写 memcpy 函数:完成内存移动,并为其写一个简单的测试用例来进行测试。

够简单的吧?我相信大部分学计算机的同学很快就能给出一个答案,但是,在写完你的代码之后,请你在仔细的阅读一下你的代码,你的代码有没有考虑以下几种情况呢?

内存是否重叠?

代码有没有对参数进行合法性检查?

是否能够避免地要进行指针强制转换?

初写代码的时候,往往考虑的是程序正常工作的情况该怎么处理。当你有了几年经验,写了几万行代码后就会发现,处理异常部分的分支代码有时比正常的主干线代码还要多,而这也正是高质量程序和一般程序拉开差距的地方。

如果把软件产品当作一台机器,那么这样一个个细小的函数和类就是零部件,只有当这些零部件质量都很高时,整个软件产品的质量才会高,不然就会像前几年的国产轿车一样,今天这个零件罢工明天那个零件休息。

而作为检验这些零部件的测试用例,一定要模拟各种恶劣的环境,将零部件隐藏的缺陷暴露出来,从这意义上说,编写测试用例的程序员要比软件设计的程序员思维要更严谨才行。

4. Share

关于程序员的时间和收入,一些不成熟的思考,受到阮一峰老师的这篇文章的启发

​http://www.ruanyifeng.com/blog/2019/04/weekly-issue-50.html​

在这篇文章的开头,阮一峰老师表达了自己关于时间换取收入的一些思考。

原文是这样的

“我觉得,越来越多的程序员正在落入这个陷井,用编码的时间换取收入。只有不停地做项目,才能拿到钱。项目做得越多,收入越高。这个项目开发完了,公司又让他去干下一个项目。 忙了好几年,项目完成了一大堆,但是自己什么也没留下,以后的收入还要取决于从零开始的新项目。这样的话,你跟出租车司机有何两样,哪一天你不写代码了,不是照样没收入。

那些赚到大钱的人,没有一个是靠时间换取收入的。他们要么通过积累资产致富,要么购买他人的时间,为自己创造财富。你应该警惕,不要落入”时间换取收入”的陷井,不要只顾着为别人生产代码,而要注意积累自己的资产,以及适时开展属于自己的业务。”

阮一峰老师讲的东西跟自己最近思考的一些东西不谋而合。之前在大飞老师的朋友圈看到了两个新词:内在能力和外在资源。

什么意思呢?说的就是程序员要培养自己的内在能力和外在资源。

所谓内在能力:是指自身所掌握的知识和技能。比如技术能力,写作能力,英语的阅读理解能力。这些能力的获得,不太需要依赖他人,只需要自己认真努力地学习和做好自身的工作就行了。

所谓外在资源:是指你的人脉,圈内影响力,甚至博客的读者数或公众号的关注数。这部分不能只通过自身地学习来获得,而需要进行线上或线下与人沟通交互的方式来积累。

而且你有没有发现,技术人员对于提升自己内在能力是相当热衷的,而且乐此不疲。究其原因,可能是这种提升自己内在能力的活动,能够获得很好的外在的正反馈,而这种正反馈,会不断地增加你做这类事情的动力,所以技术人员对这类的事情都很热衷。

但对于外在资源,技术人员大部分就不太感兴趣了。比如去外面认识一个之前不认识的人,给别的团队做培训,做分享,你可能都会觉得浪费了时间。但这些事情却能带来人脉或影响力。

自己不成熟的一些见解

「内在能力」好比修炼内功;「外在资源」好比提升影响力,拓展自我认知。

一个技术人员正常的职业发展,前期基本都是在积累自身的内在能力,当到达一个阶段的时候,除非确定自己确实适合做技术,深挖技术这条路,以后决定走技术专家路线,否则的话,越到后面,外在资源会显得越来越重要。

所以,要跟不同的行业优秀的人多多交流,多多学习。学习别人的长处,弥补自己的短处。

你有什么别的思考和见解呢?欢迎留言一起交流~

PS:以上个人看法,仅供参考。


ARTS-第-25-期_git_03