如何使用JavaScript在Node.js命令行中打印指定长宽的空心矩形
JavaScript 命令行打印空心矩形实现方案
问题背景
需要在Node.js环境下,通过JavaScript接收行列参数,在命令行打印空心矩形,原有代码多次调整后仍无法得到预期结果。
原有问题代码
function printRectangle(rows, cols) { let i, j; for (i = 0; i <= rows; i++) { for (j = 0; j <= cols; j++) { if (i < 2 || i === rows || j < 2 || j <= cols - 15) { process.stdout.write('*'); } else { if (i < 2 || i === rows || j === 2 || j <= cols - 5) { process.stdout.write(' '); } // process.stdout.write(' '); } } process.stdout.write('*****\n'); } } // 用户输入 let rows = 10, columns = 30; printRectangle(rows, columns);
问题排查
原有代码存在三个核心错误:
- 循环边界设置错误:
i <= rows和j <= cols会导致最终输出的行列数比输入参数多1,不符合预期尺寸 - 边框判断逻辑硬编码:写死了
cols-15、cols-5这类固定数值,无法适配不同的输入尺寸,也不符合空心矩形的通用判断规则 - 多余输出逻辑:每行遍历完成后额外输出
*****,会导致所有行末尾多出多余的星号
正确实现
空心矩形的核心判断逻辑非常简单:遍历所有坐标点,只要是第一行、最后一行、第一列、最后一列的位置,就输出星号,其余位置输出空格即可。
function printRectangle(rows, cols) { // 遍历所有行 for (let i = 0; i < rows; i++) { // 遍历当前行的所有列 for (let j = 0; j < cols; j++) { // 判断是否为边框位置 if (i === 0 || i === rows - 1 || j === 0 || j === cols - 1) { process.stdout.write('*'); } else { process.stdout.write(' '); } } // 换行进入下一行 process.stdout.write('\n'); } } // 测试用例:10行30列矩形 const rows = 10; const columns = 30; printRectangle(rows, columns);
如果需要调整边框的粗细,比如上下2行、左右2列的粗边框,只需要修改判断条件即可:
// 粗边框判断逻辑示例 if (i < 2 || i >= rows - 2 || j < 2 || j >= cols - 2) { process.stdout.write('*'); } else { process.stdout.write(' '); }
内容的提问来源于stack exchange,提问作者eprince_hub
相关产品推荐
相关产品推荐

