diff --git a/docs/notes/Java 基础.md b/docs/notes/Java 基础.md index 79766c8d..aebd8eea 100644 --- a/docs/notes/Java 基础.md +++ b/docs/notes/Java 基础.md @@ -1432,8 +1432,8 @@ Java 注解是附加在代码中的一些元信息,用于一些工具在编译 ## JRE or JDK -- JRE is the JVM program, Java application need to run on JRE. -- JDK is a superset of JRE, JRE + tools for developing java programs. e.g, it provides the compiler "javac" +- JRE:Java Runtime Environment,Java 运行环境的简称,为 Java 的运行提供了所需的环境。它是一个 JVM 程序,主要包括了 JVM 的标准实现和一些 Java 基本类库。 +- JDK:Java Development Kit,Java 开发工具包,提供了 Java 的开发及运行环境。JDK 是 Java 开发的核心,集成了 JRE 以及一些其它的工具,比如编译 Java 源码的编译器 javac 等。 # 参考资料 diff --git a/docs/notes/Leetcode 题解 - 位运算.md b/docs/notes/Leetcode 题解 - 位运算.md index 35e72dd7..82af161f 100644 --- a/docs/notes/Leetcode 题解 - 位运算.md +++ b/docs/notes/Leetcode 题解 - 位运算.md @@ -1,4 +1,5 @@ +* [0. 原理](#0-原理) * [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同) * [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素) * [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数) @@ -15,7 +16,9 @@ -**基本原理** +# 0. 原理 + +**基本原理** 0s 表示一串 0,1s 表示一串 1。 @@ -25,31 +28,87 @@ x ^ 1s = ~x x & 1s = x x | 1s = 1s x ^ x = 0 x & x = x x | x = x ``` -- 利用 x ^ 1s = \~x 的特点,可以将位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。 -- 利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。 -- 利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。 +利用 x ^ 1s = \~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。 -位与运算技巧: +``` +1^1^2 = 2 +``` -- n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。 -- n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。 -- n-n&(\~n+1) 去除 n 的位级表示中最高的那一位。 +利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。 -移位运算: +``` +01011011 & +00111100 +-------- +00011000 +``` -- \>\> n 为算术右移,相当于除以 2n; -- \>\>\> n 为无符号右移,左边会补上 0。 -- << n 为算术左移,相当于乘以 2n。 +利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。 -** mask 计算** +``` +01011011 | +00111100 +-------- +01111111 +``` + +**位与运算技巧** + +n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制表示 01011011,减去 1 得到 01011010,这两个数相与得到 01011010。 + +``` +01011011 & +01011010 +-------- +01011010 +``` + +n&(-n) 得到 n 的位级表示中最低的那一位 1。-n 得到 n 的反码加 1,也就是 -n=\~n+1。例如对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。 + +``` +10110100 & +01001100 +-------- +00000100 +``` + +n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1) 效果一样。 + +**移位运算** + +\>\> n 为算术右移,相当于除以 2n,例如 -7 \>\> 2 = -2。 + +``` +11111111111111111111111111111001 >> 2 +-------- +11111111111111111111111111111110 +``` + +\>\>\> n 为无符号右移,左边会补上 0。例如 -7 \>\>\> 2 = 1073741822。 + +``` +11111111111111111111111111111001 >>> 2 +-------- +00111111111111111111111111111111 +``` + +<< n 为算术左移,相当于乘以 2n。-7 << 2 = -28。 + +``` +11111111111111111111111111111001 << 2 +-------- +11111111111111111111111111100100 +``` + +**mask 计算** 要获取 111111111,将 0 取反即可,\~0。 -要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask :00010000。 +要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask :00010000。 -要得到 1 到 i 位为 1 的 mask,(1<<i)-1 即可,例如将 (1<<4)-1 = 00010000-1 = 00001111。 +要得到 1 到 i 位为 1 的 mask,(1<
-广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 +广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 第一层: @@ -76,32 +76,38 @@ ```java public int shortestPathBinaryMatrix(int[][] grids) { - int[][] direction = {{1, -1}, {1, 0}, {1, 1}, {0, -1}, {0, 1}, {-1, -1}, {-1, 0}, {-1, 1}}; - int m = grids.length, n = grids[0].length; - Queue> queue = new LinkedList<>(); - queue.add(new Pair<>(0, 0)); - int pathLength = 0; - while (!queue.isEmpty()) { - int size = queue.size(); - pathLength++; - while (size-- > 0) { - Pair cur = queue.poll(); - int cr = cur.getKey(), cc = cur.getValue(); - grids[cr][cc] = 1; // 标记 - for (int[] d : direction) { - int nr = cr + d[0], nc = cc + d[1]; - if (nr < 0 || nr >= m || nc < 0 || nc >= n || grids[nr][nc] == 1) { + if (grids == null || grids.length == 0 || grids[0].length == 0) { + return -1; + } + int[][] direction = {{1, -1}, {1, 0}, {1, 1}, {0, -1}, {0, 1}, {-1, -1}, {-1, 0}, {-1, 1}}; + int m = grids.length, n = grids[0].length; + Queue> queue = new LinkedList<>(); + queue.add(new Pair<>(0, 0)); + int pathLength = 0; + while (!queue.isEmpty()) { + int size = queue.size(); + pathLength++; + while (size-- > 0) { + Pair cur = queue.poll(); + int cr = cur.getKey(), cc = cur.getValue(); + if (grids[cr][cc] == 1) { continue; } - if (nr == m - 1 && nc == n - 1) { - return pathLength + 1; + if (cr == m - 1 && cc == n - 1) { + return pathLength; + } + grids[cr][cc] = 1; // 标记 + for (int[] d : direction) { + int nr = cr + d[0], nc = cc + d[1]; + if (nr < 0 || nr >= m || nc < 0 || nc >= n) { + continue; + } + queue.add(new Pair<>(nr, nc)); } - queue.add(new Pair<>(nr, nc)); } } + return -1; } - return -1; -} ``` ## 2. 组成整数的最小平方数数量 diff --git a/docs/notes/Leetcode-Database 题解.md b/docs/notes/Leetcode-Database 题解.md index ec1e31af..b62acfbe 100644 --- a/docs/notes/Leetcode-Database 题解.md +++ b/docs/notes/Leetcode-Database 题解.md @@ -827,7 +827,7 @@ https://leetcode.com/problems/rank-scores/description/ | 2 | 4.2 | 2 | 2 | | 3 | 4.3 | 1 | 1 | -使用连接操作找到某个 score 对应的大于其值的记录: +使用连接操作找到某个 score 对应的大于等于其值的记录: ```sql SELECT @@ -890,7 +890,7 @@ ORDER BY | score | Rank | | :---: | :--: | | 4.2 | 1 | -| 4.2 | 2 | +| 4.2 | 1 | | 4.1 | 2 | 连接情况如下: diff --git a/docs/notes/Linux.md b/docs/notes/Linux.md index 1280ba40..2f715fb4 100644 --- a/docs/notes/Linux.md +++ b/docs/notes/Linux.md @@ -1021,7 +1021,7 @@ g/re/p(globally search a regular expression and print),使用正则表示式 ```html $ grep [-acinv] [--color=auto] 搜寻字符串 filename --c : 统计个数 +-c : 统计匹配到行的个数 -i : 忽略大小写 -n : 输出行号 -v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行 @@ -1039,7 +1039,7 @@ $ grep -n 'the' regular_express.txt 18:google is the best tools for search keyword ``` -示例:正则表达式 a{m,n} 用来匹配字符 a m\~n 次,这里需要将 { 和 } 进行转移,因为它们在 shell 是有特殊意义的。 +示例:正则表达式 a{m,n} 用来匹配字符 a m\~n 次,这里需要将 { 和 } 进行转义,因为它们在 shell 是有特殊意义的。 ```html $ grep -n 'a\{2,5\}' regular_express.txt diff --git a/docs/notes/剑指 Offer 题解 - 目录.md b/docs/notes/剑指 Offer 题解 - 目录.md index a7c246bc..f9dcd846 100644 --- a/docs/notes/剑指 Offer 题解 - 目录.md +++ b/docs/notes/剑指 Offer 题解 - 目录.md @@ -1,3 +1,10 @@ +# 前言 + +题目来自《何海涛. 剑指 Offer[M]. 电子工业出版社, 2012.》,刷题网站推荐: + +- [牛客网](https://www.nowcoder.com/ta/coding-interviews?from=cyc_github) +- [Leetcode](https://leetcode-cn.com/problemset/lcof/) + # 目录 @@ -78,10 +85,6 @@ - [67. 把字符串转换成整数](67.%20把字符串转换成整数.md) - [68. 树中两个节点的最低公共祖先](68.%20树中两个节点的最低公共祖先.md) -# 参考文献 - -何海涛. 剑指 Offer[M]. 电子工业出版社, 2012. - diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 79766c8d..aebd8eea 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1432,8 +1432,8 @@ Java 注解是附加在代码中的一些元信息,用于一些工具在编译 ## JRE or JDK -- JRE is the JVM program, Java application need to run on JRE. -- JDK is a superset of JRE, JRE + tools for developing java programs. e.g, it provides the compiler "javac" +- JRE:Java Runtime Environment,Java 运行环境的简称,为 Java 的运行提供了所需的环境。它是一个 JVM 程序,主要包括了 JVM 的标准实现和一些 Java 基本类库。 +- JDK:Java Development Kit,Java 开发工具包,提供了 Java 的开发及运行环境。JDK 是 Java 开发的核心,集成了 JRE 以及一些其它的工具,比如编译 Java 源码的编译器 javac 等。 # 参考资料 diff --git a/notes/Leetcode 题解 - 位运算.md b/notes/Leetcode 题解 - 位运算.md index 35e72dd7..82af161f 100644 --- a/notes/Leetcode 题解 - 位运算.md +++ b/notes/Leetcode 题解 - 位运算.md @@ -1,4 +1,5 @@ +* [0. 原理](#0-原理) * [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同) * [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素) * [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数) @@ -15,7 +16,9 @@ -**基本原理** +# 0. 原理 + +**基本原理** 0s 表示一串 0,1s 表示一串 1。 @@ -25,31 +28,87 @@ x ^ 1s = ~x x & 1s = x x | 1s = 1s x ^ x = 0 x & x = x x | x = x ``` -- 利用 x ^ 1s = \~x 的特点,可以将位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。 -- 利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。 -- 利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。 +利用 x ^ 1s = \~x 的特点,可以将一个数的位级表示翻转;利用 x ^ x = 0 的特点,可以将三个数中重复的两个数去除,只留下另一个数。 -位与运算技巧: +``` +1^1^2 = 2 +``` -- n&(n-1) 去除 n 的位级表示中最低的那一位。例如对于二进制表示 10110100,减去 1 得到 10110011,这两个数相与得到 10110000。 -- n&(-n) 得到 n 的位级表示中最低的那一位。-n 得到 n 的反码加 1,对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。 -- n-n&(\~n+1) 去除 n 的位级表示中最高的那一位。 +利用 x & 0s = 0 和 x & 1s = x 的特点,可以实现掩码操作。一个数 num 与 mask:00111100 进行位与操作,只保留 num 中与 mask 的 1 部分相对应的位。 -移位运算: +``` +01011011 & +00111100 +-------- +00011000 +``` -- \>\> n 为算术右移,相当于除以 2n; -- \>\>\> n 为无符号右移,左边会补上 0。 -- << n 为算术左移,相当于乘以 2n。 +利用 x | 0s = x 和 x | 1s = 1s 的特点,可以实现设值操作。一个数 num 与 mask:00111100 进行位或操作,将 num 中与 mask 的 1 部分相对应的位都设置为 1。 -** mask 计算** +``` +01011011 | +00111100 +-------- +01111111 +``` + +**位与运算技巧** + +n&(n-1) 去除 n 的位级表示中最低的那一位 1。例如对于二进制表示 01011011,减去 1 得到 01011010,这两个数相与得到 01011010。 + +``` +01011011 & +01011010 +-------- +01011010 +``` + +n&(-n) 得到 n 的位级表示中最低的那一位 1。-n 得到 n 的反码加 1,也就是 -n=\~n+1。例如对于二进制表示 10110100,-n 得到 01001100,相与得到 00000100。 + +``` +10110100 & +01001100 +-------- +00000100 +``` + +n-(n&(-n)) 则可以去除 n 的位级表示中最低的那一位 1,和 n&(n-1) 效果一样。 + +**移位运算** + +\>\> n 为算术右移,相当于除以 2n,例如 -7 \>\> 2 = -2。 + +``` +11111111111111111111111111111001 >> 2 +-------- +11111111111111111111111111111110 +``` + +\>\>\> n 为无符号右移,左边会补上 0。例如 -7 \>\>\> 2 = 1073741822。 + +``` +11111111111111111111111111111001 >>> 2 +-------- +00111111111111111111111111111111 +``` + +<< n 为算术左移,相当于乘以 2n。-7 << 2 = -28。 + +``` +11111111111111111111111111111001 << 2 +-------- +11111111111111111111111111100100 +``` + +**mask 计算** 要获取 111111111,将 0 取反即可,\~0。 -要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask :00010000。 +要得到只有第 i 位为 1 的 mask,将 1 向左移动 i-1 位即可,1<<(i-1) 。例如 1<<4 得到只有第 5 位为 1 的 mask :00010000。 -要得到 1 到 i 位为 1 的 mask,(1<<i)-1 即可,例如将 (1<<4)-1 = 00010000-1 = 00001111。 +要得到 1 到 i 位为 1 的 mask,(1<
-广度优先搜索一层一层地进行遍历,每层遍历都以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 +广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点。需要注意的是,遍历过的节点不能再次被遍历。 第一层: @@ -76,32 +76,38 @@ ```java public int shortestPathBinaryMatrix(int[][] grids) { - int[][] direction = {{1, -1}, {1, 0}, {1, 1}, {0, -1}, {0, 1}, {-1, -1}, {-1, 0}, {-1, 1}}; - int m = grids.length, n = grids[0].length; - Queue> queue = new LinkedList<>(); - queue.add(new Pair<>(0, 0)); - int pathLength = 0; - while (!queue.isEmpty()) { - int size = queue.size(); - pathLength++; - while (size-- > 0) { - Pair cur = queue.poll(); - int cr = cur.getKey(), cc = cur.getValue(); - grids[cr][cc] = 1; // 标记 - for (int[] d : direction) { - int nr = cr + d[0], nc = cc + d[1]; - if (nr < 0 || nr >= m || nc < 0 || nc >= n || grids[nr][nc] == 1) { + if (grids == null || grids.length == 0 || grids[0].length == 0) { + return -1; + } + int[][] direction = {{1, -1}, {1, 0}, {1, 1}, {0, -1}, {0, 1}, {-1, -1}, {-1, 0}, {-1, 1}}; + int m = grids.length, n = grids[0].length; + Queue> queue = new LinkedList<>(); + queue.add(new Pair<>(0, 0)); + int pathLength = 0; + while (!queue.isEmpty()) { + int size = queue.size(); + pathLength++; + while (size-- > 0) { + Pair cur = queue.poll(); + int cr = cur.getKey(), cc = cur.getValue(); + if (grids[cr][cc] == 1) { continue; } - if (nr == m - 1 && nc == n - 1) { - return pathLength + 1; + if (cr == m - 1 && cc == n - 1) { + return pathLength; + } + grids[cr][cc] = 1; // 标记 + for (int[] d : direction) { + int nr = cr + d[0], nc = cc + d[1]; + if (nr < 0 || nr >= m || nc < 0 || nc >= n) { + continue; + } + queue.add(new Pair<>(nr, nc)); } - queue.add(new Pair<>(nr, nc)); } } + return -1; } - return -1; -} ``` ## 2. 组成整数的最小平方数数量 diff --git a/notes/Leetcode-Database 题解.md b/notes/Leetcode-Database 题解.md index ec1e31af..b62acfbe 100644 --- a/notes/Leetcode-Database 题解.md +++ b/notes/Leetcode-Database 题解.md @@ -827,7 +827,7 @@ https://leetcode.com/problems/rank-scores/description/ | 2 | 4.2 | 2 | 2 | | 3 | 4.3 | 1 | 1 | -使用连接操作找到某个 score 对应的大于其值的记录: +使用连接操作找到某个 score 对应的大于等于其值的记录: ```sql SELECT @@ -890,7 +890,7 @@ ORDER BY | score | Rank | | :---: | :--: | | 4.2 | 1 | -| 4.2 | 2 | +| 4.2 | 1 | | 4.1 | 2 | 连接情况如下: diff --git a/notes/Linux.md b/notes/Linux.md index 1280ba40..2f715fb4 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1021,7 +1021,7 @@ g/re/p(globally search a regular expression and print),使用正则表示式 ```html $ grep [-acinv] [--color=auto] 搜寻字符串 filename --c : 统计个数 +-c : 统计匹配到行的个数 -i : 忽略大小写 -n : 输出行号 -v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行 @@ -1039,7 +1039,7 @@ $ grep -n 'the' regular_express.txt 18:google is the best tools for search keyword ``` -示例:正则表达式 a{m,n} 用来匹配字符 a m\~n 次,这里需要将 { 和 } 进行转移,因为它们在 shell 是有特殊意义的。 +示例:正则表达式 a{m,n} 用来匹配字符 a m\~n 次,这里需要将 { 和 } 进行转义,因为它们在 shell 是有特殊意义的。 ```html $ grep -n 'a\{2,5\}' regular_express.txt diff --git a/notes/剑指 Offer 题解 - 目录.md b/notes/剑指 Offer 题解 - 目录.md index a7c246bc..f9dcd846 100644 --- a/notes/剑指 Offer 题解 - 目录.md +++ b/notes/剑指 Offer 题解 - 目录.md @@ -1,3 +1,10 @@ +# 前言 + +题目来自《何海涛. 剑指 Offer[M]. 电子工业出版社, 2012.》,刷题网站推荐: + +- [牛客网](https://www.nowcoder.com/ta/coding-interviews?from=cyc_github) +- [Leetcode](https://leetcode-cn.com/problemset/lcof/) + # 目录 @@ -78,10 +85,6 @@ - [67. 把字符串转换成整数](67.%20把字符串转换成整数.md) - [68. 树中两个节点的最低公共祖先](68.%20树中两个节点的最低公共祖先.md) -# 参考文献 - -何海涛. 剑指 Offer[M]. 电子工业出版社, 2012. -