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

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

### LeetCode 中 JavaScriptACM 竞赛模式使用与配置 #### 配置 VSCode 使用 JavaScript 刷 LeetCode 为了在本地环境中高效地使用 JavaScript 解决 LeetCode 问题并模拟 ACM 模式的运行环境,可以按照以下方法完成配置: 安装 leetcode 插件到 Visual Studio Code 是第一步操作[^1]。此插件能够帮助开发者更方便地管理题目以及测试代码。 接着,在项目文件夹下初始化 Node.js 环境以便执行 JavaScript 文件。通过命令行工具输入 `npm init -y` 创建默认 package.json 文件,并确保已全局安装 nodemon 或其他热更新模块用于实时调试代码变化情况。 对于具体的编码实践方面,则需注意遵循良好的编程习惯来构建清晰易懂的数据结构定义方式。如当处理涉及复杂节点关系如二叉树或者单向/双向链表等问题时,应该先明确定义这些基本单元类及其属性成员函数等内容[^2]。 以下是创建一个简单的 TreeNode 类型作为子展示如何规范化描述此类对象: ```javascript class TreeNode { constructor(val, left = null, right = null){ this.val = val; this.left = left; this.right = right; } } ``` #### 使用 JavaScriptACM 模式下的注意事项 在 LeetCode 平台切换至 ACM Mode 后,除了提交最终解答外还需要提供完整的程序实现过程说明文档。这意味着不仅要给出正确答案而且要解释清楚每一步逻辑推理依据是什么样的算法原理支撑起来的。 因此建议平时练习过程中养成记录思路的习惯,比如采用 markdown 格式撰写配套解析文章上传个人博客分享经验心得;同时积极参与社区讨论交流学习他人优秀做法不断改进自我水平。 另外值得注意的是由于不同浏览器引擎之间可能存在兼容性差异所以在实际比赛前最好提前确认所使用的标准库版本号等细节信息以免临场发生意外状况影响成绩表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值