mirror of
https://github.com/142vip/408CSFamily.git
synced 2026-04-14 10:20:29 +08:00
5.5 算法代码
This commit is contained in:
@@ -272,10 +272,9 @@
|
||||
|
||||
#### 数学问题
|
||||
|
||||
- 数组中出现次数超过一半的数字
|
||||
- 圆圈中最后剩下的数
|
||||
- 从1到n整数中1出现的次数
|
||||
|
||||
- [【简单】数组中出现次数超过一半的数字](./算法/剑指/数学/MoreThanHalfNum_Solution.js)
|
||||
- [【中等】圆圈中最后剩下的数 约瑟夫问题](./算法/剑指/数学/LastRemaining_Solution.js)
|
||||
- [【中等】从1到n整数中1出现的次数](./算法/剑指/数学/NumberOf1Between1AndN_Solution.js)
|
||||
#### 位运算
|
||||
|
||||
- 二进制中1的个数
|
||||
|
||||
BIN
算法/剑指/.DS_Store
vendored
Normal file
BIN
算法/剑指/.DS_Store
vendored
Normal file
Binary file not shown.
72
算法/剑指/数学/LastRemaining_Solution.js
Normal file
72
算法/剑指/数学/LastRemaining_Solution.js
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* @Description: 【中等】圆圈中最后剩下的数 约瑟夫问题
|
||||
* @Version: Beta1.0
|
||||
* @Author: 【B站&公众号】Rong姐姐好可爱
|
||||
* @Date: 2021-05-05 14:48:28
|
||||
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
|
||||
* @LastEditTime: 2021-05-05 15:11:02
|
||||
*/
|
||||
|
||||
|
||||
|
||||
// 把n个人的编号改为0~n-1,然后对删除的过程进行分析。
|
||||
// 第一个删除的数字是(m-1)%n,几位k,则剩余的编号为(0,1,...,k-1,k+1,...,n-1),下次开始删除时,顺序为(k+1,...,n-1,0,1,...k-1)。
|
||||
// 用f(n,m)表示从(0~n-1)开始删除后的最终结果。
|
||||
// 用q(n-1,m)表示从(k+1,...,n-1,0,1,...k-1)开始删除后的最终结果。
|
||||
// 则f(n,m)=q(n-1,m)。
|
||||
|
||||
// 下面把(k+1,...,n-1,0,1,...k-1)转换为(0~n-2)的形式,即
|
||||
// k+1对应0
|
||||
// k+2对于1
|
||||
// ...
|
||||
// k-1对应n-2
|
||||
// 转化函数设为p(x)=(x-k-1)%n, p(x)的逆函数为p^(x)=(x+k+1)%n。
|
||||
// 则f(n,m)=q(n-1,m)=p^(f(n-1,m))=(f(n-1,m)+k+1)%n,又因为k=(m-1)%n。
|
||||
// 取余
|
||||
// f(n,m)=(f(n-1,m)+m)%n;
|
||||
|
||||
// 最终的递推关系式为
|
||||
// f(1,m) = 0; (n=1)
|
||||
// f(n,m)=(f(n-1,m)+m)%n; (n>1)
|
||||
|
||||
function LastRemaining_Solution (n, m) {
|
||||
// write code here
|
||||
// 递推公式: f(0)=-1 f(1)=0 f(i)={f(i-1)+m}%i
|
||||
|
||||
if (n === 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n === 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 递归
|
||||
return (LastRemaining_Solution(n - 1, m) + m) % n;
|
||||
|
||||
}
|
||||
|
||||
// 非递归实现
|
||||
function LastRemaining_Solution01 (n, m) {
|
||||
|
||||
// 当然,这里也可以添加上负数的校验情况
|
||||
if (n === 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (n === 1) {
|
||||
return 0
|
||||
}
|
||||
|
||||
// 循环处理
|
||||
let result = 0
|
||||
for (let index = 2; index <= n; index++) {
|
||||
// f(n,m)=[f(n-1,m)+m]%n
|
||||
result = (result + m) % index
|
||||
}
|
||||
// 返回
|
||||
return result;
|
||||
}
|
||||
module.exports = {
|
||||
LastRemaining_Solution: LastRemaining_Solution
|
||||
};
|
||||
40
算法/剑指/数学/MoreThanHalfNum_Solution.js
Normal file
40
算法/剑指/数学/MoreThanHalfNum_Solution.js
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* @Description: 【 简单】数组中出现次数超过一半的数字
|
||||
* @Version: Beta1.0
|
||||
* @Author: 【B站&公众号】Rong姐姐好可爱
|
||||
* @Date: 2021-05-05 14:28:36
|
||||
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
|
||||
* @LastEditTime: 2021-05-05 14:29:22
|
||||
*/
|
||||
|
||||
// 借助map计数即可
|
||||
function MoreThanHalfNum_Solution (numbers) {
|
||||
// write code here
|
||||
let map = new Map();
|
||||
|
||||
numbers.forEach(item => {
|
||||
if (map.has(item)) {
|
||||
map.set(item, map.get(item) + 1)
|
||||
} else {
|
||||
map.set(item, 1)
|
||||
}
|
||||
})
|
||||
|
||||
const arr = [...new Set(numbers)];
|
||||
|
||||
// console.log(map,arr)
|
||||
let result = 0;
|
||||
|
||||
arr.map(item => {
|
||||
if (2 * map.get(item) > numbers.length) {
|
||||
result = item;
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
module.exports = {
|
||||
MoreThanHalfNum_Solution: MoreThanHalfNum_Solution
|
||||
};
|
||||
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* @Description:
|
||||
* @Description: 【中等】从1到n整数中1出现的次数
|
||||
* @Version: Beta1.0
|
||||
* @Author: 【B站&公众号】Rong姐姐好可爱
|
||||
* @Date: 2021-04-26 22:23:17
|
||||
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
|
||||
* @LastEditTime: 2021-04-26 22:27:23
|
||||
* @LastEditTime: 2021-05-05 15:15:56
|
||||
*/
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ function NumberOf1Between1AndN_Solution(n)
|
||||
return count;
|
||||
}
|
||||
|
||||
console.log(NumberOf1Between1AndN_Solution(13))
|
||||
// console.log(NumberOf1Between1AndN_Solution(13))
|
||||
module.exports = {
|
||||
NumberOf1Between1AndN_Solution : NumberOf1Between1AndN_Solution
|
||||
};
|
||||
Reference in New Issue
Block a user