Compare commits
4 Commits
030e04b5d2
...
40a676cd31
Author | SHA1 | Date | |
---|---|---|---|
40a676cd31 | |||
9a4d2d388f | |||
27d3b489e3 | |||
89042e81a8 |
10
.vscode/settings.json
vendored
10
.vscode/settings.json
vendored
@ -2,7 +2,11 @@
|
||||
"C_Cpp.clang_format_fallbackStyle": "LLVM",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "always"
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode", // 使用 Prettier 格式化
|
||||
"editor.formatOnSave": true, // 保存时自动格式化
|
||||
"prettier.requireConfig": true, // 只有在项目中有 Prettier 配置时才格式化
|
||||
"eslint.alwaysShowStatus": true, // 显示 ESLint 状态
|
||||
"eslint.format.enable": true // 允许 ESLint 格式化
|
||||
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
export * from './link-list.js'
|
||||
export * from './link-list.js';
|
||||
|
79
package-lock.json
generated
79
package-lock.json
generated
@ -9,11 +9,12 @@
|
||||
"version": "1.0.0",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"eslint": "^8.57.0",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-prettier": "^5.1.3"
|
||||
"eslint-plugin-prettier": "^5.2.3",
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@aashutoshrathi/word-wrap": {
|
||||
@ -73,21 +74,24 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@eslint/js": {
|
||||
"version": "8.57.0",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
|
||||
"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
|
||||
"version": "8.57.1",
|
||||
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
|
||||
"integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
"version": "0.11.14",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
|
||||
"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
|
||||
"version": "0.13.0",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
|
||||
"integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
|
||||
"deprecated": "Use @eslint/config-array instead",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@humanwhocodes/object-schema": "^2.0.2",
|
||||
"@humanwhocodes/object-schema": "^2.0.3",
|
||||
"debug": "^4.3.1",
|
||||
"minimatch": "^3.0.5"
|
||||
},
|
||||
@ -109,10 +113,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@humanwhocodes/object-schema": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
|
||||
"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
|
||||
"dev": true
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
|
||||
"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
|
||||
"deprecated": "Use @eslint/object-schema instead",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/@nodelib/fs.scandir": {
|
||||
"version": "2.1.5",
|
||||
@ -154,6 +160,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
|
||||
"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^12.20.0 || ^14.18.0 || >=16.0.0"
|
||||
},
|
||||
@ -694,16 +701,18 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint": {
|
||||
"version": "8.57.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
|
||||
"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
|
||||
"version": "8.57.1",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
|
||||
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
|
||||
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.2.0",
|
||||
"@eslint-community/regexpp": "^4.6.1",
|
||||
"@eslint/eslintrc": "^2.1.4",
|
||||
"@eslint/js": "8.57.0",
|
||||
"@humanwhocodes/config-array": "^0.11.14",
|
||||
"@eslint/js": "8.57.1",
|
||||
"@humanwhocodes/config-array": "^0.13.0",
|
||||
"@humanwhocodes/module-importer": "^1.0.1",
|
||||
"@nodelib/fs.walk": "^1.2.8",
|
||||
"@ungap/structured-clone": "^1.2.0",
|
||||
@ -772,6 +781,7 @@
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
|
||||
"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"eslint-config-prettier": "bin/cli.js"
|
||||
},
|
||||
@ -878,13 +888,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-prettier": {
|
||||
"version": "5.1.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz",
|
||||
"integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==",
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz",
|
||||
"integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"prettier-linter-helpers": "^1.0.0",
|
||||
"synckit": "^0.8.6"
|
||||
"synckit": "^0.9.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^14.18.0 || >=16.0.0"
|
||||
@ -1962,11 +1973,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.2.5",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
|
||||
"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
|
||||
"integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
|
||||
"dev": true,
|
||||
"peer": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
@ -2328,10 +2339,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/synckit": {
|
||||
"version": "0.8.8",
|
||||
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz",
|
||||
"integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==",
|
||||
"version": "0.9.2",
|
||||
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
|
||||
"integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@pkgr/core": "^0.1.0",
|
||||
"tslib": "^2.6.2"
|
||||
@ -2362,10 +2374,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
|
||||
"dev": true
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true,
|
||||
"license": "0BSD"
|
||||
},
|
||||
"node_modules/type-check": {
|
||||
"version": "0.4.0",
|
||||
|
@ -21,10 +21,11 @@
|
||||
"author": "yigencong",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"eslint": "^8.57.0",
|
||||
"eslint": "^8.57.1",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-prettier": "^5.1.3"
|
||||
"eslint-plugin-prettier": "^5.2.3",
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
}
|
||||
|
3
recursion/recursion.md
Normal file
3
recursion/recursion.md
Normal file
@ -0,0 +1,3 @@
|
||||
# 递归
|
||||
|
||||
此目录存放了常用递归思路,以及一些解决方案
|
61
recursion/排序一个栈.js
Normal file
61
recursion/排序一个栈.js
Normal file
@ -0,0 +1,61 @@
|
||||
/**
|
||||
* @param {Stack} stack
|
||||
* @description 将一个栈的所有元素按照从栈底到栈顶依此从小到大排列
|
||||
* 思路:假设我们有一个栈[1,7,2,2,5,3],我们把它想象成空的,第一步我们插入1,由于现在栈是空的,所以直接push(1)
|
||||
* 即可,第二步,我们插入7,按照要求栈顶的元素应该要比栈底的元素小,所以7不能直接push,所以我们需要pop(1),之后再
|
||||
* 判断是否可以插入7,当1 弹出后由于没有元素直接push(7),之后我们再把弹出的1重新压入栈顶即可,此时栈里面有两个元素
|
||||
* [7,1],我们继续来压入2,2比栈顶元素大所以弹出栈顶元素,此时发现栈顶元素比2大符合要求,所以直接push(2),之后再把之前
|
||||
* 的1压入即可,此时栈里面有3个元素[7,2,1],继续压入2同理,之后压入5,我们比较栈顶元素和5,发现5比栈顶元素大,所以弹出
|
||||
* 1,之后再比较,发现比此时的栈顶元素2大,所以弹出2,之后再比较2,发现还是大,所以继续弹出此时的栈顶元素2,之后发现没有7
|
||||
* 大,所以此时直接push(5)即可,并且把之前弹出的元素依此push即可,此时栈里面的内容为[7,5,2,2,1],最后一个元素3同理。
|
||||
*
|
||||
* 分析:上面的思路我们从栈底元素开始处理,再不借助另一个“后进先出”的数据结构,我们只能借助递归,递归本身就带空间,回溯的时候
|
||||
* 处理即可,我们在插入的时候发现每次的弹出的数据都需要保留,并且还需要按着原顺序插入,在这里我们也需要一个递归的插入函数,原因
|
||||
* 很简单,我们需要保留当前弹出的值,并且依此插入,所以创建两个函数,第一个函数sortStack,这个函数把整个栈弹出,从栈底元素开始处理
|
||||
* 依此调用insertInSortedOrder把当前元素插入到正确的地方。
|
||||
*/
|
||||
import Stack from '../stack/index.js';
|
||||
|
||||
/**
|
||||
* 排序栈
|
||||
*
|
||||
* @param {Stack} stack 要排序的栈
|
||||
*/
|
||||
function sortStack(stack) {
|
||||
if (stack.isEmpty()) return; // 如果栈为空,递归终止
|
||||
const cur = stack.pop(); // 保存栈顶元素
|
||||
sortStack(stack); // 递归排序栈中的其他元素
|
||||
// 将当前栈顶元素插入到已排序的栈中
|
||||
insertInSortedOrder(stack, cur);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将元素插入到已排序栈中
|
||||
*
|
||||
* @param {Stack} stack 要插入的栈
|
||||
* @param {number} item 要插入的元素
|
||||
*/
|
||||
function insertInSortedOrder(stack, item) {
|
||||
// 如果栈为空,或者栈顶元素大于等于当前元素,直接将当前元素插入栈中
|
||||
if (stack.isEmpty() || stack.peek() >= item) {
|
||||
stack.push(item);
|
||||
} else {
|
||||
// 如果栈顶元素小于当前元素,弹出栈顶元素
|
||||
const cur = stack.pop();
|
||||
// 递归插入当前元素
|
||||
insertInSortedOrder(stack, item);
|
||||
// 将弹出的栈顶元素重新压入栈中
|
||||
stack.push(cur);
|
||||
}
|
||||
}
|
||||
|
||||
// 测试代码
|
||||
const stack = new Stack([1, 7, 2, 2, 5, 3]);
|
||||
|
||||
console.log('Original Stack:');
|
||||
stack.print(); // 输出: 1, 7, 2, 2, 5, 3
|
||||
|
||||
sortStack(stack); // 排序栈
|
||||
|
||||
console.log('Sorted Stack:');
|
||||
stack.print(); // 输出: 1, 2, 2, 3, 5, 7
|
35
recursion/逆序一个栈.js
Normal file
35
recursion/逆序一个栈.js
Normal file
@ -0,0 +1,35 @@
|
||||
import Stack from '../stack/index.js';
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Stack} stack 需要处理的栈
|
||||
* 思路:我们首先需要有一个把栈底元素弹出的方法,当获取栈底元素之后,我们只需把剩余的元素逆序,再把这个
|
||||
* 栈底元素插入栈顶即可。
|
||||
*/
|
||||
function reverse(stack) {
|
||||
if (stack.isEmpty()) return;
|
||||
const last = bottomOut(stack); // 弹出栈的底部元素
|
||||
reverse(stack);
|
||||
stack.push(last);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Stack} stack - 需要处理的栈
|
||||
* @description 将一个栈的底部元素弹出
|
||||
* @return number
|
||||
*/
|
||||
function bottomOut(stack) {
|
||||
const ans = stack.pop();
|
||||
if (stack.isEmpty()) {
|
||||
return ans;
|
||||
}
|
||||
const last = bottomOut(stack);
|
||||
stack.push(ans);
|
||||
return last;
|
||||
}
|
||||
|
||||
const stack = new Stack([1, 2, 3, 4, 5, 6, 7]); // 创建一个栈,栈顶元素为5
|
||||
|
||||
reverse(stack);
|
||||
stack.print();
|
50
stack/index.js
Normal file
50
stack/index.js
Normal file
@ -0,0 +1,50 @@
|
||||
class Stack {
|
||||
constructor(items = []) {
|
||||
this.items = items; // 用 items 来存储栈的元素
|
||||
}
|
||||
|
||||
// 入栈
|
||||
push(item) {
|
||||
this.items.push(item);
|
||||
}
|
||||
|
||||
// 出栈
|
||||
pop() {
|
||||
if (this.isEmpty()) {
|
||||
console.log('栈为空! ');
|
||||
return undefined; // 栈为空时返回 undefined
|
||||
}
|
||||
return this.items.pop();
|
||||
}
|
||||
|
||||
// 获取栈顶元素
|
||||
peek() {
|
||||
if (this.isEmpty()) {
|
||||
console.log('栈为空! ');
|
||||
return undefined; // 栈为空时返回 undefined
|
||||
}
|
||||
return this.items[this.items.length - 1];
|
||||
}
|
||||
|
||||
// 判断栈是否为空
|
||||
isEmpty() {
|
||||
return this.items.length === 0;
|
||||
}
|
||||
|
||||
// 获取栈的大小
|
||||
size() {
|
||||
return this.items.length;
|
||||
}
|
||||
|
||||
// 清空栈
|
||||
clear() {
|
||||
this.items = [];
|
||||
}
|
||||
|
||||
// 打印栈内容
|
||||
print() {
|
||||
console.log(this.items.toString());
|
||||
}
|
||||
}
|
||||
|
||||
export default Stack;
|
Loading…
x
Reference in New Issue
Block a user