ARTS-第-22-期_反向代理

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

每周完成一个 ARTS

Algorithm 来源 来源 LeetCode 135. Candy

Review 分享 分享 medium 上一篇关于 Cookies 的文章

Tip 分享为什么在不同的地方 ping 同一个域名可能出现得到不同的 IP 地址?

Share 分享为什么人会懒惰的一些思考 

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

ARTS-第-22-期_代理服务器_02

1.Algorithm

LeetCode 135. Candy 难度:[Medium]

【题意】

老师想给孩子们发糖果,有 N 个孩子站成了一条直线,老师根据每一个孩子的表现情况,会预先给他们每个人都打好评分。

你要按照以下要求帮助老师给这些孩子分发糖果:

1. 每个孩子都至少应该有1个糖果。 

2. 相邻的孩子中,评分高的孩子必须获得更多的糖果。 

那么这样下来,至少需要准备多少颗糖果呢?

【样例】

Example 1:

Input: [1,0,2]

Output: 5

Explanation: You can allocate to the first, second and third child with 2, 1, 2 candies respectively.

Example 2:

Input: [1,2,2]

Output: 4

Explanation: You can allocate to the first, second and third child with 1, 2, 1 candies respectively.The third child gets 1 candy because it satisfies the above two conditions.

【思路】

分糖果,经典题。

这道题看起来很难,其实解法并没有那么复杂。在这里给出一个两次遍历,O(n)的做法。

定义一个数组 ,储存每个人应该得到的糖果数。第一遍从左向右遍历,如果判断 B 小盆友分数比 A 小盆友低,则 A 小盆友 应该所得糖果数就是 B 小盆友 所得 +1。

同理从右边往左边循环,如果判断 B 小盆友分数比 A 小盆友高,并且 B 小盆友的糖果数比 A 小盆友的糖果少,则 B 小盆友应该所得糖果数就是 A 小盆友所得 +1。

最后再把所有小盆友的糖果数都加起来返回即可。

【解法一】(C++)

/*
Author: https://github.com/rongweihe
Time: 2019-03-17
*/
// Time complexity : O(n).
// Space complexity : O(n).
class Solution {
public:
int candy(vector<int>& ratings) {
int len = ratings.size();
int ans[len+1];
for(int i=0; i<len; ++i) ans[i]=1;
if(len==0) return -1;
if(len==1) return 1;
int sum=0;
for(int i=1; i<len; ++i) {
if(ratings[i] > ratings [i-1]) {
ans[i]=ans[i-1]+1;
}
}
for(int i=len-2; i>=0; --i) {
if(ratings [i+1] < ratings[i] && ans[i]<=ans[i+1]) {
ans[i]=ans[i+1]+1;
}
}
for(int i=0; i<len; ++i){
sum+=ans[i];
}
return sum;
}
};

另外还有一次遍历的方法,相比于遍历两次的思路简单明了,感兴趣的可以自己尝试去实现一番。

2.Review

受到这篇文章的启发

 lingfeng.art/2019/03/15

本周阅读了 medium 上一篇关于 Cookies 的文章:cookies-vs-localstorage-whats-the-difference。阅读原文即可访问链接。

什么是Cookie?

一条 Cookies 记录就是存储在用户主机浏览器中的一小段文本文件。Cookies 是纯文本形式,它们不包含任何可执行代码。Cookies 只是包含了数据,就其本身而言并不有害。

Cookies 可以被使用在不同的地方上,比如存储用户浏览过的网页信息或者是用户的登录信息。Cookies 经常被用于记录用户的登录信息,或者是根据用户的浏览习惯定制适用于用户的一些服务。

两种不同的 Cookies

第一种是 Persistent Cookies,第二种是 SessionCookies

SessionCookies

SessionCookies 存储周期很短,这种类型的 Cookies 经常被用于在银行中导航的凭证,浏览器一关闭,信息也就丢失了

Persistent Cookies

Persistent Cookies 有一个截止的期限,它们可以存储到截止的期限然后被删除。它们可以用于记录用户的访问习惯,以便于大型的网站根据它们去提升用户的体验。

LocalStorage

HTML5 本地存储的前身就是 Cookies ,但是自从 HTML5 出来之后,很多使用 Cookies 的地方都被LocalStorage 取代了。LocalStorage 相较于Cookies有很多的优点,一个很重要的原因是,传输数据的时候不用每一次 HTTP 请求,这节省了很多数据带宽。

HTML5 的本地存储是使用 LocalStorage 对象将 WEB 数据持久化在本地。相比较而言 HTML5 本地存储中每个域的存储大小默认是 5M,比起 Cookies 的 4K 要大的多。而且存储和读取数据的代码极为简练:

Window.localStorage.setItem(key,value);//存储数据 
Window.localStorage.getItem(key);//读取数据
Window.localStorage.removeItem(key);//删除数据项
Window.localStorage.clear();//删除所有数据

3. Tip

HTTP 三种代理服务器模式

为什么在不同的地方 ping 同一个域名可能出现得到不同的 IP 地址呢?

这是因为这些 IP 地址实际上是代理服务器的 IP 地址。

在 HTTP 通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个 HTTP 请求可能被多个代理服务器转发,代理服务器按照其使用方法和作用,分为正向代理服务器,反向代理服务器和透明代理服务器。

1. 正向代理服务器

要求客户端自己设置代理服务器的地址。客户端的每次请求都将直接发送到该代理服务器,并由代理服务器来请求目标资源。

2. 反向代理服务器

设置在服务器端,因而客户端无须进行任何设置。反向代理是指用代理服务器接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器。并将从内部服务器上得到的结果返回给客户端。

3. 透明代理服务器

透明代理服务器只能设置在网关上,用户访问 Internet 的数据报必然都经过网关,如果在网关上设置代理,则该代理对于用户来说就是透明度,透明代理可以看做是正向代理的一种特殊情况。

代理服务器还提供缓存目标资源的功能,这样带来的好处就是用户下一次访问同一资源时速度提升上来了。优秀的开源软件 squid,varnish 都是提供了缓存能力的代理服务器软件,其中 squid 支持所有代理方式,而 varnish 只支持反向代理。

4. Share

为什么人会懒惰呢?

一个人每天要从事各种活动,一方面人体从食物中获取能量,另一方面人的活动又要消耗大量能量。

举个栗子,人在平躺的时候,能量消耗是最低的,所以从另外一个方面,从身体的角度倾向于最小能量的消耗。

同样当一个人思考学习新知识,接受新观念的时候,也是要大量消耗能量的时候,所以人们倾向于不思考或者少思考。

这从另一方面解释了为什么有的人有主动型思维,而有的人是被动型思维。

主动型思维的人一开始能够有意识的去训练自己接寻找,探索新知识,接受不同观点和事情。慢慢的达到一种主动型的习惯。

而被动型思维的人,习惯于不假思索的接受,不加思考的消化和吸收,从而慢慢丧失辨别事情真伪的能力。(回头看看你的手机上安装了多少信息流的 APP,每一天你都要浏览多少无用的信息)。 

同理为什么有的人会很勤快呢?

这是为了增加能量消耗。举个例子,爱健身的朋友通过健身锻炼,适度出出汗,消耗了能量,但是他们会获得更好的收益,比如身体更加健康了,外形变得更加美好了,无论是职场还是情场,都更容易受到青睐。

同样,愿意主动思考学习的人,也是消耗更多,但是成长更快,薪资增长高,收益更多。

举个栗子,把你丢到一间很干净整洁的屋子里宅上半把月之后,房子还会有原来那么干净整洁吗?

这个世界是一个逐渐慢慢变得熵增的世界。用物理学的语言叫熵减,使得事物通过整理变得有序化,消耗能量,获得新的空间。

不知道上面几句话有没有对你有启发,如果觉得不错,欢迎点赞,评论,转发,留言一起讨论。


ARTS-第-22-期_客户端_03