1
0
mirror of https://github.com/142vip/408CSFamily.git synced 2026-04-15 02:41:07 +08:00

[5.5 coding]

This commit is contained in:
mmdapl
2021-05-05 12:59:45 +08:00
parent bd1b40e4bc
commit 030009023f
9 changed files with 265 additions and 63 deletions

View File

@@ -183,25 +183,28 @@
- 栈的压入、弹出序列
### 双指针
- 和为S的两个数字
- 和为S的连续正数序列
- 翻转单词顺序列
- 左旋转字符串
- [【中等】和为S的两个数字](./算法/剑指/双指针/FindNumbersWithSum.js)
- [【中等】和为S的连续正数序列](./算法/剑指/双指针/FindContinuousSequence.js)
- [【中等】左旋转字符串](./算法/剑指/双指针/LeftRotateString.js)
- [【较难】翻转单词顺序列](./算法/剑指/双指针/ReverseSentence.js)
### 链表
- 从尾到头打印链表
- 在O(1)时间内删除链表节点
- 删除链表中重复的结点
- 链表中倒数第K个结点
- 链表中环的入口结点
- 反转链表
- 合并两个排序的链表
- 复杂链表的复制
- 两个链表的第一个公共结点
- [【简单】合并两个排序的链表](./算法/剑指/链表/Merge.js)
- [【简单】两个链表的第一个公共结点](./算法/剑指/链表/FindFirstCommonNode.js)
- [【中等】链表中倒数第K个结点](./算法/剑指/链表/FindKthToTail.js)
- [【中等】反转链表](./算法/剑指/链表/ReverseList.js)
- [【较难】从尾到头打印链表](./算法/剑指/链表/printListFromTailToHead.js)
- ~~在O(1)时间内删除链表节点~~
- [【较难】删除链表中重复的结点](./算法/剑指/链表/deleteDuplication.js)
- 链表中环的入口结点[暂时没思路]
- 【较难】复杂链表的复制[暂时没有思路]
### 树
@@ -223,62 +226,62 @@
- 树中两个节点的最低公共祖先
### 贪心思想
### 综合类型
#### 贪心思想
- 剪绳子
- 股票的最大利润
- [【LeetCode题目】股票的最大利润](./算法/剑指/贪心思想/maxProfit.js)
### 二分查找
#### 二分查找
- 旋转数组的最小数字
- 数字在排序数组中出现的次数
- [【简单】旋转数组的最小数字](./算法/剑指/二分查找/minNumberInRotateArray.js)
- [【中等】数字在排序数组中出现的次数](./算法/剑指/二分查找/GetNumberOfK.js)
### 分治
#### 分治
- 数值的整数次方
- [【中等】数值的整数次方](./分治/Power.js)
### 搜索
#### 搜索
- 矩阵中的路
- 矩阵中的路径 有难度
- 机器人的运动范围
- 字符串的排列
### 排列
#### 排列
- 调整数组顺序使奇数位于偶数前面
- 把数组排成最小的数
- 数组中的逆序对
- [【中等】调整数组顺序使奇数位于偶数前面](./算法/剑指/排列/reOrderArray.js)
- [【较难】把数组排成最小的数](./算法/剑指/双指针/ReverseSentence.js)
- 数组中的逆序对 困难
### 动态规划
#### 动态规划
- 斐波拉契数列
- 矩形覆盖
- 跳台阶
- 变态跳台阶
- 连续子数组的最大和
- 礼物的最大价值
- 最长不含重复字符的子字符串
- [【入门】斐波拉契数列](./算法/剑指/动态规划/Fibonacci.js)
- [【简单】变态跳台阶 找规律 可跳任意阶](./算法/剑指/动态规划/jumpFloorII.js)
- [【简单】连续子数组的最大和 时间复杂度O(n)](./算法/剑指/动态规划/FindGreatestSumOfSubArray.js)
- [【简单】构建乘积数组](./算法/剑指/动态规划/multiply.js)
- [【中等】矩形覆盖](./算法/剑指/动态规划/rectCover.js)
- [【中等】跳台阶 非递归,要么跳一阶,要么跳两阶](./算法/剑指/动态规划/jumpFloor.js)
- 丑数
- n个骰子的点数
- 构建乘积数组
### 数学
#### 数学问题
- 数组中出现次数超过一半的数字
- 圆圈中最后剩下的数
- 从1到n整数中1出现的次数
### 位运算
#### 位运算
- 二进制中1的个数
- 数组中只出现一次的数字
### 其他
### 其他分类
- 打印从 1 到最大的 n 位数
- 正则表达式匹配
@@ -292,7 +295,6 @@
#### [前端常考](https://www.nowcoder.com/activity/oj?tab=3)

BIN
算法/.DS_Store vendored

Binary file not shown.

View File

@@ -4,7 +4,7 @@
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-04-27 08:39:46
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-05-05 07:59:56
* @LastEditTime: 2021-05-05 12:55:06
-->
@@ -76,62 +76,62 @@
- 树中两个节点的最低公共祖先
### 贪心思想
### 综合类型
#### 贪心思想
- 剪绳子
- [【LeetCode题目】股票的最大利润](./贪心思想/maxProfit.js)
### 二分查找
#### 二分查找
- [【简单】旋转数组的最小数字](./二分查找/minNumberInRotateArray.js)
- [【中等】数字在排序数组中出现的次数](./二分查找/GetNumberOfK.js)
### 分治
#### 分治
- [【中等】数值的整数次方](./分治/Power.js)
### 搜索
#### 搜索
- 矩阵中的路径 有难度
- 机器人的运动范围
- 字符串的排列
### 排列
#### 排列
- [【中等】调整数组顺序使奇数位于偶数前面](./排列/reOrderArray.js)
- [【较难】把数组排成最小的数](./双指针/ReverseSentence.js)
- 数组中的逆序对
- 数组中的逆序对 困难
### 动态规划
#### 动态规划
- 斐波拉契数列
- 矩形覆盖
- 跳台阶
- 变态跳台阶
- 连续子数组的最大和
- 礼物的最大价值
- 最长不含重复字符的子字符串
- [【入门】斐波拉契数列](./动态规划/Fibonacci.js)
- [【简单】变态跳台阶 找规律 可跳任意阶](./动态规划/jumpFloorII.js)
- [【简单】连续子数组的最大和 时间复杂度O(n)](./动态规划/FindGreatestSumOfSubArray.js)
- [【简单】构建乘积数组](./动态规划/multiply.js)
- [【中等】矩形覆盖](./动态规划/rectCover.js)
- [【中等】跳台阶 非递归,要么跳一阶,要么跳两阶](./动态规划/jumpFloor.js)
- 丑数
- n个骰子的点数
- 构建乘积数组
### 数学
#### 数学问题
- 数组中出现次数超过一半的数字
- 圆圈中最后剩下的数
- 从1到n整数中1出现的次数
### 位运算
#### 位运算
- 二进制中1的个数
- 数组中只出现一次的数字
### 其他
### 其他分类
- 打印从 1 到最大的 n 位数
- 正则表达式匹配

View File

@@ -0,0 +1,41 @@
/*
* @Description: 【入门】斐波拉契数列
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-05-05 11:00:05
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-05-05 11:10:56
*/
function Fibonacci (n) {
// write code here
// 递归调用
return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2)
}
// 非递归实现
function Fibonacci01 (n) {
let a = 0, b = 1;
if (n < 2) {
return n;
}
let result = 0
for (let index = 2; index <= n; index++) {
// 求和
result = a + b;
a = b;
b = result;
}
// 返回结果
return result;
}
module.exports = {
Fibonacci: Fibonacci01
};

View File

@@ -0,0 +1,35 @@
/*
* @Description: 【简单】连续子数组的最大和 时间复杂度O(n)
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-05-05 11:34:21
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-05-05 11:45:11
*/
function FindGreatestSumOfSubArray (array) {
// 标记指针
let index = 0;
// 子串的累计结果
let sum = 0;
// 子串的累加和最大值,当标记位从
let max = array[index];
// 循环
while (index < array.length) {
sum += array[index];
max = sum > max ? sum : max;
// 注意,重新计数,累计求和从0开始
sum = sum > 0 ? sum : 0
index++
}
return max;
}
module.exports = {
FindGreatestSumOfSubArray: FindGreatestSumOfSubArray
};

View File

@@ -1,8 +1,50 @@
/*
* @Description:
* @Description: 【中等】跳台阶 递归,要么跳一阶,要么跳两阶
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-04-28 23:41:55
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-04-28 23:41:55
* @LastEditTime: 2021-05-05 11:32:38
*/
/**
*
* 思路: 对于第number台阶只能从第number-1或者number-2上跳上来
* 记作: G(number)=G(number-1)+G(number-2)
* 即: 从第number-1跳上来的次数+从第number-2上跳上来的次数
*
*/
// 递归实现
function jumpFloor (number) {
// write code here
// 递归,要么跳一阶,要么跳两阶
return number < 3 ? number : jumpFloor(number - 1) + jumpFloor(number - 2)
}
// 非递归调用
function jumpFloor01 (number) {
let a = 1;
let b = 2;
let result = 0;
if (number < 3) {
return number
}
for (let index = 3; index <= number; index++) {
result = a + b;
a = b;
b = result;
}
// 返回
return result;
}
module.exports = {
jumpFloor: jumpFloor
};

View File

@@ -4,5 +4,28 @@
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-04-28 23:41:50
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-04-28 23:41:51
* @LastEditTime: 2021-05-05 11:26:46
*/
function jumpFloorII (number) {
// write code here
// 我tm跳1 还剩下n-1阶 记作 G(n-1) 可选
// 我tm跳2 还剩下n-2阶 记作 G(n-2) 可选
// ....
// 我tm跳n-1 还剩下1阶 记作 G(1) 可选
// 归纳出: G(n-1)=G(1)+G(2)+.....+G(n-2);
// G(n)=G(1)+G(2)+.....+G(n-2)+G(n-1)
// 两个相减 G(n)=2* G(n-1) 去递归 G(1)=1 , G(2)=2 G(3)=2*G(2)=4
// 开始代码
// return Math.pow(2,number-1)
// 位运算
// return 1<<(number-1)
return 1 << --number
}
module.exports = {
jumpFloorII: jumpFloorII
};

View File

@@ -0,0 +1,23 @@
/*
* @Description: 【简单】构建乘积数组
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-04-24 11:51:20
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-05-05 12:48:43
*/
function multiply (array) {
let result = [];
for (let index = 0; index < array.length; index++) {
// result.push(array.slice(0, index).reduce((res, item) => res * item, 1) * array.slice(index + 1).reduce((res, item) => res * item, 1))
result.push([...array.slice(0, index), ...array.slice(index + 1)].reduce((res, item) => {
return res * item;
},1)) // 给res的初始值为1
}
return result;
}
console.log(multiply([1, 2, 3, 4, 5]))

View File

@@ -0,0 +1,36 @@
/*
* @Description: 【中等】矩形覆盖
* @Version: Beta1.0
* @Author: 【B站&公众号】Rong姐姐好可爱
* @Date: 2021-05-05 11:17:02
* @LastEditors: 【B站&公众号】Rong姐姐好可爱
* @LastEditTime: 2021-05-05 11:18:08
*/
function rectCover (number) {
// write code here
// 应该也是个递归 斐波拉契变形
// n=1 ---> 1
// n=2 ---> 2
// n=3 ---> 3 <---- 1+2
// n=4 ---> 5 <---- 2+3
let a = 1; // n=1的情况
let b = 2; // n=2的情况
if (number < 3) {
return number;
}
let result = 0;
for (let index = 3; index <= number; index++) {
result = a + b;
a = b;
b = result;
}
return result;
}
module.exports = {
rectCover: rectCover
};