JS (node) 的 ACM 模式 + debug方法 (01背包为例)
文章目录
- JS 的 ACM 模式
- 输入处理
- JS dubug (01背包为例)
- 动态输入
- 在本地通过 Node.js 运行和调试
- 硬编码 Hard Coding
- VS Code
JS 的 ACM 模式
在 JavaScript 中,ACM 模式一般通过 Node.js 的 readline 模块实现。
输入处理
使用 readline
模块监听输入。
将每行输入存入数组中。
当输入结束( close
事件触发)时,解析数据并处理问题。
const readline = require('readline');
// 创建输入接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = []; // 用于存储所有输入数据
// 每行输入都会触发 'line' 事件
rl.on('line', (line) => {
input.push(line); // 存储每行输入
});
// 输入结束后触发 'close' 事件
rl.on('close', () => {
// 数据处理逻辑放在这里
console.log(input); // 示例:输出输入的所有行
});
JS dubug (01背包为例)
- 这是一段01背包的JS代码
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
readline.on('line', (line) => {
input.push(line);
});
readline.on('close', () => {
let [n, bagweight] = input[0].split(' ').map(Number);
let weight = input[1].split(' ').map(Number);
let value = input[2].split(' ').map(Number);
let dp = Array.from({ length: n }, () => Array(bagweight + 1).fill(0));
for (let j = weight[0]; j <= bagweight; j++) {
dp[0][j] = value[0];
}
for (let i = 1; i < n; i++) {
for (let j = 0; j <= bagweight; j++) {
if (j < weight[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
}
}
console.log(dp[n - 1][bagweight]);
});
在浏览器中无法直接运行这段代码,因为它使用了 Node.js 的 readline 模块,这是服务器端的功能,而不是浏览器环境中的 API。
动态输入
定义:数据来自代码外部,例如用户输入、文件、数据库、API 请求等。
在本地通过 Node.js 运行和调试
代码文件保存为 单个 js
在终端运行 node solution.js
(确保电脑里有node,通过node -v确认)
然后在终端中手动输入测试数据,例如:
3 4
2 1 3
4 2 3
按 Ctrl+D 表示输入结束,代码将执行并输出结果:(注意代码中输出了6为结果)
可以通过在代码中插入console.log
语句,打印中间变量的值,检查程序的执行逻辑
硬编码 Hard Coding
定义:将固定的值直接写入代码中,不能在运行时动态改变。
VS Code
VS Code 的调试环境不支持动态交互的标准输入
因此
将:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
input.push(line);
});
rl.on('close', () => {
console.log("用户输入:", input);
});
替换为:
let input = [
"3 4", // 模拟第一行输入
"2 1 3", // 模拟第二行输入
"4 2 3" // 模拟第三行输入
];
(() => {
console.log("模拟输入:", input);
})();
- 01背包代码变为:
// 替代 readline 输入
let input = [
"3 4", // 第一行:n 和 bagweight
"2 1 3", // 第二行:weight 数组
"4 2 3", // 第三行:value 数组
];
// 模拟 readline 的 close 逻辑
(() => {
let [n, bagweight] = input[0].split(' ').map(Number);
let weight = input[1].split(' ').map(Number);
let value = input[2].split(' ').map(Number);
// 调试输出
console.log('输入的重量数组:', weight);
console.log('输入的价值数组:', value);
let dp = Array.from({ length: n }, () => Array(bagweight + 1).fill(0));
for (let j = weight[0]; j <= bagweight; j++) {
dp[0][j] = value[0];
}
for (let i = 1; i < n; i++) {
for (let j = 0; j <= bagweight; j++) {
if (j < weight[i]) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
}
}
console.log('动态规划结果:', dp);
console.log('最大价值:', dp[n - 1][bagweight]);
})();
在vscode中打开这一段代码,CTRL + ~
打开终端。
选择 JavaScript Debug Terminal 模式
切换到这个js文件在的绝对路径根目录
选择一个debug 点
node sol.js
运行
选择上面的按钮进行 debug
还有很多其他用法,不一一列举了。