提交 73bb201a 编写于 作者: C CyC2018

auto commit

上级 87550052
...@@ -4231,6 +4231,33 @@ public ListNode deleteDuplicates(ListNode head) { ...@@ -4231,6 +4231,33 @@ public ListNode deleteDuplicates(ListNode head) {
} }
``` ```
**删除链表的倒数第 n 个节点**
[Leetcode : 19. Remove Nth Node From End of List (Medium)](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)
```html
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
```
```java
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode fast = newHead;
while (n-- > 0) {
fast = fast.next;
}
ListNode slow = newHead;
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return newHead.next;
}
```
**交换链表中的相邻结点** **交换链表中的相邻结点**
[Leetcode : 24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/) [Leetcode : 24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/)
......
...@@ -330,7 +330,7 @@ FROM mytable ...@@ -330,7 +330,7 @@ FROM mytable
可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等。
指定的分组字段除了能让数组按该字段进行分组,也可以按该字段进行排序,例如按 col 字段排序并分组数据: 指定的分组字段除了能按该字段进行分组,也可以按该字段进行排序,例如按 col 字段排序并分组数据:
```sql ```sql
SELECT col, COUNT(*) AS num SELECT col, COUNT(*) AS num
...@@ -338,29 +338,29 @@ FROM mytable ...@@ -338,29 +338,29 @@ FROM mytable
GROUP BY col; GROUP BY col;
``` ```
WHERE 过滤行,HAVING 过滤分组。行过滤应当先与分组过滤; GROUP BY 是按照分组字段进行排序,ORDER BY 也可以以汇总字段来进行排序。
```sql ```sql
SELECT col, COUNT(*) AS num SELECT col, COUNT(*) AS num
FROM mytable FROM mytable
WHERE col > 2
GROUP BY col GROUP BY col
HAVING COUNT(*) >= 2; ORDER BY num;
``` ```
GROUP BY 的排序结果为分组字段,而 ORDER BY 也可以以聚集字段来进行排序。 WHERE 过滤行,HAVING 过滤分组。行过滤应当先与分组过滤;
```sql ```sql
SELECT col, COUNT(*) AS num SELECT col, COUNT(*) AS num
FROM mytable FROM mytable
WHERE col > 2
GROUP BY col GROUP BY col
ORDER BY num; HAVING COUNT(*) >= 2;
``` ```
分组规定: 分组规定:
1. GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前; 1. GROUP BY 子句出现在 WHERE 子句之后,ORDER BY 子句之前;
2. 除了汇总计算语句的字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出; 2. 除了汇总字段外,SELECT 语句中的每一字段都必须在 GROUP BY 子句中给出;
3. NULL 的行会单独分为一组; 3. NULL 的行会单独分为一组;
4. 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。 4. 大多数 SQL 实现不支持 GROUP BY 列具有可变长度的数据类型。
...@@ -374,7 +374,7 @@ ORDER BY num; ...@@ -374,7 +374,7 @@ ORDER BY num;
SELECT * SELECT *
FROM mytable1 FROM mytable1
WHERE col1 IN (SELECT col2 WHERE col1 IN (SELECT col2
FROM mytable2); FROM mytable2);
``` ```
下面的语句可以检索出客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次: 下面的语句可以检索出客户的订单数量,子查询语句会对第一个查询检索出的每个客户执行一次:
...@@ -390,7 +390,7 @@ ORDER BY cust_name; ...@@ -390,7 +390,7 @@ ORDER BY cust_name;
# 十五、连接 # 十五、连接
连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 Where 连接用于连接多个表,使用 JOIN 关键字,并且条件语句使用 ON 而不是 WHERE
连接可以替换子查询,并且比子查询的效率一般会更快。 连接可以替换子查询,并且比子查询的效率一般会更快。
...@@ -463,8 +463,8 @@ from employee natural join department; ...@@ -463,8 +463,8 @@ from employee natural join department;
```sql ```sql
select Customers.cust_id, Orders.order_num select Customers.cust_id, Orders.order_num
from Customers left outer join Orders from Customers left outer join Orders
on Customers.cust_id = Orders.curt_id; on Customers.cust_id = Orders.curt_id;
``` ```
如果需要统计顾客的订单数,使用聚集函数。 如果需要统计顾客的订单数,使用聚集函数。
...@@ -522,9 +522,7 @@ WHERE col5 = val; ...@@ -522,9 +522,7 @@ WHERE col5 = val;
## 使用存储过程的好处 ## 使用存储过程的好处
1. 代码封装,保证了一定的安全性; 1. 代码封装,保证了一定的安全性;
2. 代码复用; 2. 代码复用;
3. 由于是预先编译,因此具有很高的性能。 3. 由于是预先编译,因此具有很高的性能。
## 创建存储过程 ## 创建存储过程
......
...@@ -58,7 +58,7 @@ Two-phase Commit(2PC)。 ...@@ -58,7 +58,7 @@ Two-phase Commit(2PC)。
<div align="center"> <img src="../pics//3f5bba4b-7813-4aea-b578-970c7e3f6bf3.jpg"/> </div><br> <div align="center"> <img src="../pics//3f5bba4b-7813-4aea-b578-970c7e3f6bf3.jpg"/> </div><br>
如果 Acceptor 接到一个提议请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送提议响应,该提议响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。 如果 Acceptor 接到一个提议请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送提议响应,该提议响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。
如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的提议请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的提议请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的提议响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。 如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的提议请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的提议请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的提议响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。
...@@ -66,7 +66,7 @@ Two-phase Commit(2PC)。 ...@@ -66,7 +66,7 @@ Two-phase Commit(2PC)。
当一个 Proposer 接收到超过一半 Acceptor 的提议响应时,就可以发送接受请求。 当一个 Proposer 接收到超过一半 Acceptor 的提议响应时,就可以发送接受请求。
Proposer A 接到两个提议响应之后,就发送 [n=2, v=8] 接受请求。该接受请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。 Proposer A 接到两个提议响应之后,就发送 [n=2, v=8] 接受请求。该接受请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。
Proposer B 过后也收到了两个提议响应,因此也开始发送接受请求。需要注意的是,接受请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的接受请求。 Proposer B 过后也收到了两个提议响应,因此也开始发送接受请求。需要注意的是,接受请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的接受请求。
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#### 2.1 消息处理模型 #### 2.1 消息处理模型
(一)点对点 (一)消息队列
<div align="center"> <img src="../pics//96b63e13-e2d8-4ddb-9aa1-a38959ca96e5.jpg" width="700"/> </div><br> <div align="center"> <img src="../pics//96b63e13-e2d8-4ddb-9aa1-a38959ca96e5.jpg" width="700"/> </div><br>
......
...@@ -311,8 +311,6 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回 ...@@ -311,8 +311,6 @@ InnoDB 的 MVCC 使用到的快照存储在 Undo 日志中,该日志通过回
## 快照读与当前读 ## 快照读与当前读
快照读读指的是而当前读指的是
### 1. 当前读 ### 1. 当前读
读取最新的数据。 读取最新的数据。
...@@ -335,8 +333,6 @@ update ; ...@@ -335,8 +333,6 @@ update ;
delete; delete;
``` ```
# 六、Next-Key Locks # 六、Next-Key Locks
Next-Key Locks 也是 MySQL 的 InnoDB 存储引擎的一种锁实现。MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读隔离级别下,MVCC + Next-Key Locks,就可以防止幻读的出现。 Next-Key Locks 也是 MySQL 的 InnoDB 存储引擎的一种锁实现。MVCC 不能解决幻读的问题,Next-Key Locks 就是为了解决这个问题而存在的。在可重复读隔离级别下,MVCC + Next-Key Locks,就可以防止幻读的出现。
......
...@@ -206,6 +206,8 @@ a.+c ...@@ -206,6 +206,8 @@ a.+c
**|** 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。 **|** 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。
**正则表达式**
``` ```
(19|20)\d{2} (19|20)\d{2}
``` ```
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册