diff --git a/notes/Java 容器.md b/notes/Java 容器.md index e42a42f0..3a7343f9 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -25,7 +25,7 @@ ## Collection -

+

### 1. Set diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index e128e1d3..3e19a632 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -2415,7 +2415,8 @@ public int climbStairs(int n) { 定义 dp 数组用来存储最大的抢劫量,其中 dp[i] 表示抢到第 i 个住户时的最大抢劫量。 由于不能抢劫邻近住户,因此如果抢劫了第 i 个住户那么只能抢劫 i - 2 或者 i - 3 的住户,所以 -dp[i] = max(dp[i-1], dp[i-2] + nums[i])
+ +

```java public int rob(int[] nums) { @@ -2427,7 +2428,6 @@ public int rob(int[] nums) { } return pre1; } - ``` **强盗在环形街区抢劫** @@ -2505,9 +2505,9 @@ public int minPathSum(int[][] grid) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0) { - if (j>0) dp[j] = dp[j - 1]; + dp[j] = dp[j - 1]; } else { - if (j>0) dp[j] = Math.min(dp[j - 1], dp[j]); + dp[j] = Math.min(dp[j - 1], dp[j]); } dp[j] += grid[i][j]; } @@ -3086,7 +3086,6 @@ public int findTargetSumWays(int[] nums, int S) { int W = (sum + S) / 2; int[] dp = new int[W + 1]; dp[0] = 1; - Arrays.sort(nums); for (int num : nums) { for (int i = W; i >= num; i--) { dp[i] = dp[i] + dp[i - num]; diff --git a/notes/Redis.md b/notes/Redis.md index 58320dfa..fe34c7e7 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -355,7 +355,7 @@ List 是一个双向链表,可以通过 lpop 和 lpush 写入和读取消息 ## 会话缓存 -在分布式场景下具有多个应用服务器,可以使用 Redis 来统一存储这些应用服务器的会话信息。 +可以使用 Redis 来统一存储多台应用服务器的会话信息。 当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。 diff --git a/notes/分布式.md b/notes/分布式.md index d2b2f974..2adba608 100644 --- a/notes/分布式.md +++ b/notes/分布式.md @@ -335,5 +335,4 @@ Raft 也是分布式一致性协议,主要是用来竞选主节点。 - [What is CAP theorem in distributed database system?](http://www.colooshiki.com/index.php/2017/04/20/what-is-cap-theorem-in-distributed-database-system/) - [NEAT ALGORITHMS - PAXOS](http://harry.me/blog/2014/12/27/neat-algorithms-paxos/) - [Paxos By Example](https://angus.nyc/2012/paxos-by-example/) -- [ACID](https://en.wikipedia.org/wiki/ACID_(computer_science)) diff --git a/notes/攻击技术.md b/notes/攻击技术.md index 31eeaaa4..115456cb 100644 --- a/notes/攻击技术.md +++ b/notes/攻击技术.md @@ -111,7 +111,7 @@ http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName 这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。 -透过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 +通过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 ## 防范手段 diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index c0c4364e..00d26160 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -879,7 +879,7 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户 虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。 -为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面时最近最久未访问的。 +为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。 因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。 diff --git a/notes/设计模式.md b/notes/设计模式.md index c177ff92..e990677e 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -95,7 +95,7 @@ private static Singleton uniqueInstance = new Singleton(); 只需要对 getUniqueInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了实例化多次 uniqueInstance。 -但是当一个线程进入该方法之后,其它试图进入该方法的线程都必须等待,即使 uniqueInstance 已经被实例化了。这会让线程阻塞时间过程,因此该方法有性能问题,不推荐使用。 +但是当一个线程进入该方法之后,其它试图进入该方法的线程都必须等待,即使 uniqueInstance 已经被实例化了。这会让线程阻塞时间过长,因此该方法有性能问题,不推荐使用。 ```java public static synchronized Singleton getUniqueInstance() { diff --git a/notes/集群.md b/notes/集群.md index 111495c3..cd2af078 100644 --- a/notes/集群.md +++ b/notes/集群.md @@ -116,11 +116,6 @@ HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服 ### 3. 反向代理服务器 -首先了解一下正向代理与反向代理的区别: - -- 正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端; -- 反向代理:发生在服务器端,用户不知道反向代理的存在。 - 反向代理服务器位于源服务器前面,用户的请求需要先经过反向代理服务器才能到达源服务器。反向代理可以用来进行缓存、日志记录等,同时也可以用来做为负载均衡服务器。 在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址。