diff --git a/0 Numeral/数值.md b/0 Numeral/数值.md index e15e89e..1a43fa5 100644 --- a/0 Numeral/数值.md +++ b/0 Numeral/数值.md @@ -1,4 +1,20 @@ # 数值 +`n&(n-1)` 作用是消除数字 n 的二进制表示中的最后一个 1 + + +一个数和它本身做异或运算(^)结果为 0,即 `a ^ a = 0` + + +不用临时变量交换两个数 + +``` +int a = 1, b = 2; +a ^= b; +b ^= a; +a ^= b; +// 现在 a = 2, b = 1 +``` + diff --git a/7 Search/README.md b/7 Search/README.md index 0c213e9..df64db2 100644 --- a/7 Search/README.md +++ b/7 Search/README.md @@ -36,6 +36,21 @@ int binary_search(int *a,int length,int k){ } ``` + +``` +注意细节 + + + +``` + +如果搜索有序数列是 `[1,2,2,2,2,3]` 这种,想得到 target 的左侧边界,即索引 1,或者我想得到 target 的右侧边界,即索引 4 ; 这时候怎么处理呢? + + + + + + ## 分块查找 块内无序,块之间有序;可以先二分查找定位到块,然后再到块中顺序查找。 diff --git a/8 Algorithms Analysis/动态规划.md b/8 Algorithms Analysis/动态规划.md index 9ea7dab..ab5eca7 100644 --- a/8 Algorithms Analysis/动态规划.md +++ b/8 Algorithms Analysis/动态规划.md @@ -28,5 +28,6 @@ #### 其它案例 -最短路径 +* 最短路径 +* 0-1 背包问题 diff --git a/8 Algorithms Analysis/回溯法.md b/8 Algorithms Analysis/回溯法.md index 4ed4442..92d908d 100644 --- a/8 Algorithms Analysis/回溯法.md +++ b/8 Algorithms Analysis/回溯法.md @@ -20,7 +20,6 @@ - ## 八皇后问题 8x8的国际象棋棋盘上放置8个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。任意2个皇后都不能处于同一个 横线,纵线,斜线上。 diff --git a/8 Algorithms Analysis/递归.md b/8 Algorithms Analysis/递归.md index ba9a406..674dfb7 100644 --- a/8 Algorithms Analysis/递归.md +++ b/8 Algorithms Analysis/递归.md @@ -8,6 +8,7 @@ 1) 确定递归公式 2) 确定边界条件 +> 自顶向下的递归,自底向上是迭代 ## 斐波那契数列 diff --git a/9 Algorithms Job Interview/4 数值问题.md b/9 Algorithms Job Interview/4 数值问题.md index afe39d6..918ae06 100644 --- a/9 Algorithms Job Interview/4 数值问题.md +++ b/9 Algorithms Job Interview/4 数值问题.md @@ -7,6 +7,8 @@ * 随机数 * 进制转换:位运算 * 大数问题 +* 公倍数 +* 素数 ## ipv4 转 int diff --git a/9 Algorithms Job Interview/4.1 数值-加减乘除.md b/9 Algorithms Job Interview/4.1 数值-加减乘除.md index 463fcb1..5d6a05a 100644 --- a/9 Algorithms Job Interview/4.1 数值-加减乘除.md +++ b/9 Algorithms Job Interview/4.1 数值-加减乘除.md @@ -1,6 +1,10 @@ # 数值-加减乘除 +* 等差数列 +* 阶乘 + + ## 求1+2+…+n @@ -48,17 +52,11 @@ char[] factorial(int n){ ``` +## 1024! 末尾有多少个0? -## 实现两个正整数的除法(和取模) - -编程实现两个正整数的除法,当然不能用除法操作符。 -``` -int div(const int x, const int y) -``` - -1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 -2. 位运算 - +分析: +末尾0的个数取决于2和5的个数 +能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 @@ -74,6 +72,22 @@ int div(const int x, const int y) + + + +## 实现两个正整数的除法(和取模) + +编程实现两个正整数的除法,当然不能用除法操作符。 +``` +int div(const int x, const int y) +``` + +1. 循环减被除数,减到不能再减,当除数很大,被除数小时,效率很低 +2. 位运算 + + + + ## 两个数相乘,小数点后位数没有限制,请写一个高精度算法 @@ -81,13 +95,4 @@ int div(const int x, const int y) -## 1024! 末尾有多少个0? - -分析: -末尾0的个数取决于2和5的个数 -能被2整除的数比能被5整除的数要多得多,因此只统计被5整除的数的个数 - - - - diff --git a/9 Algorithms Job Interview/4.5 数值-素树.md b/9 Algorithms Job Interview/4.5 数值-素树.md new file mode 100644 index 0000000..e2b8f5a --- /dev/null +++ b/9 Algorithms Job Interview/4.5 数值-素树.md @@ -0,0 +1,16 @@ +# 数值-素树 + +> 如果一个数如果只能被 1 和它本身整除,那么这个数就是素数 + + +## 返回区间 [2, n) 中有几个素数 + +``` +int countPrimes(int n) +``` + + + + + + diff --git a/9 Algorithms Job Interview/5.3 数列-交并集.md b/9 Algorithms Job Interview/5.3 数列-交并集.md index 0b86d91..7eb6c53 100644 --- a/9 Algorithms Job Interview/5.3 数列-交并集.md +++ b/9 Algorithms Job Interview/5.3 数列-交并集.md @@ -11,12 +11,30 @@ +## 合并2个有序数列 + + +合并2个有序数列 A 和 B, 其中 A 有足够的空间,也就是把B合并进A数组 + +如 +``` +A = [4,5,6] +B = [1,2,7] +合并后 +A = [1,2,4,5,6,7] +``` + +思路1: +思路2: + + ## 两个序列和之差最小 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 + 例如: ``` var a=[100,99,98,1,2, 3]; diff --git a/9 Algorithms Job Interview/5.4 数列-查找.md b/9 Algorithms Job Interview/5.4 数列-查找.md index b9688bd..f1763fa 100644 --- a/9 Algorithms Job Interview/5.4 数列-查找.md +++ b/9 Algorithms Job Interview/5.4 数列-查找.md @@ -1,9 +1,6 @@ # 数列-查找 - - - ## 数组中超过出现次数超过一半的数字 题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 @@ -24,6 +21,22 @@ 类似问题:找出数组中唯一的重复元素 +## 查找只出现一次的元素 + +给一个非空整数数组,比如 [2, 2, 3] ,其余元素均出现2次,找出那个只出现一次的元素。 + +思路: 异或运算,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身 + +``` +int singleNumber(vector& nums) { + int res = 0; + for (int n : nums) { + res ^= n; + } + return res; +} +``` + ## 数组中找出某数字出现的次数 @@ -112,7 +125,6 @@ Lin=< aK1,ak2,…,akm >,其中k1< k2<…< km且aK1< ak2<…< akm。 - ## 在从1到n的正数中1出现的次数