ARTS是什么?
Algorithm:每周至少做一个LeetCode的算法题
Review:阅读并点评至少一篇英文技术文章
Tip:学习至少一个技术技巧
Share:分享一篇有观点和思考的技术文章
Algorithm
15. 三数之和
- 将数组排序
- 双指针向中间逼近
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList();
int len=nums.length;
if(nums == null || len < 3) return res;
Arrays.sort(nums);
for(int i=0; i<len;i++){
int L = i+1;
int R = len-1;
if(nums[i]>0) break;
if(i>0 && nums[i] == nums[i-1]) continue;
while(L < R){
int sum = nums[i]+nums[L]+nums[R];
if(sum == 0){
res.add(Arrays.asList(nums[i],nums[L],nums[R]));
while(L<R && nums[L]==nums[L+1]) L++; //去重
while(L<R && nums[R]==nums[R-1]) R--; //去重
L++;
R--;
}
else if(sum<0) L++;
else if(sum>0) R--;
}
}
return res;
}
}
Review
GET or POST? 11 interview questions that most devs get wrong.
1. 如果浏览器作为客户端,哪一个方法保存在浏览器的session历史中
- GET参数保存在session中,点击页面的一个东西,可以返回。但是还有一种情况,就是使用ajax的时候,不会保留
- POST参数,如果用户提交表单后,然后返回,浏览器会提示你重新输入,之前的数据没有保留在历史中
2. 如果浏览器作为客户端,哪一个方法可以保留缓存
-
首先介绍幂等性,一个HTTP方法是幂等的,指的就是同样的请求被执行一次或连续执行多次效果是一样的,服务的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下,
GET
,HEAD
,PUT
和DELETE
等方法都是幂等的,而POST
方法不是。 -
GET请求可以被缓存,因为GET是幂等性的,并且大多数的网页资源都会通过这个方法返回,默认情况下,浏览器会缓存get请求,所以下次访问的时候,不必向服务器重新请求所有的资源,直接在浏览器的缓存中就能获得
-
然而这样还遇到一个问题,当服务端重新部署时,客户端依然访问本地浏览器的缓存,所以说,每个请求的URL必须改变或者客户自己清除浏览器缓存,一般来说改变请求的URL
3. 哪一个是安全的
从后台资源上,GET是安全的,因为GET不改变后台资源
从显示方面,GET是不安全的,因为数据在地址栏显示
从传输的角度,两者都是不安全的,因为HTTP在网络上是明文传输的
4. 静态网站只响应GET请求
静态网站不需要别的工具处理网站的内容,只需要返回网站的可读内容即可,比如你可以在Amazon S3托管一个静态网站
5. 哪个方法有长度限制
HTTP协议没有Body和URL的长度限制,对URL的限制大多数是浏览器和服务器的原因
浏览器原因就不说了,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。
6.总结
- GET 用于获取信息,是无副作用的,可收藏为书签,是幂等的,且可缓存,只允许ASSII字符
- POST 用于修改服务器上的数据,有副作用,不可收藏为书签,非幂等,不可缓存,没有字符限制(也允许二进制数据)
Tip
HTTP协议的四种传参方式
HTTP协议的组成 | 协议内容示例 | 对应Spring注解 |
---|---|---|
path info传参 | /articles/12 (查询id为12的文章,12是参数) | @PathVariable |
URL Query String 传参 | /articles?id=12 | @RequestParam |
Body 传参 | Content-Type:multipart/form-data | @RequestBody |
Body 传参 | Content-Type:application/json,或其他自定义格式 | @RequestBody |
Headers 传参 | @RequestHeader |
Share
- IP 协议拆分数据是因为物理设备的限制,一次能够传输的数据由路径上 MTU 最小的设备决定,一旦 IP 协议传输的数据包超过 MTU 的限制就会发生丢包,所以我们需要通过路径 MTU 发现获取传输路径上的 MTU 限制;
- TCP 协议拆分数据是为了保证传输的可靠性和顺序,作为可靠的传输协议,为了保证数据的传输顺序,它需要为每一个数据段增加包含序列号的 TCP 协议头,如果数据段大小超过了 IP 协议的 MTU 限制, 就会带来更多额外的重传和重组开销,影响性能。