JS (node) 的 ACM 模式 + debug方法 (01背包为例)

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
在这里插入图片描述

还有很多其他用法,不一一列举了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值