HackerRank星号正方形练习代码报错:NaN或无标准输出求助
问题分析与修复方案
你的代码存在多个关键错误,直接导致HackerRank返回NaN或无输出结果:
1. 字符串重复操作错误
JavaScript里字符串和数字直接相乘(asterisco * n)会返回NaN,这是不合法的操作。要生成重复n次的星号行,应该用String.repeat()方法:
let linha = asterisco.repeat(n);
2. console.log位置错误且触发递归
你把console.log(imprimaQuadradoAsterisco(n));写在了函数内部的return语句之后,这行代码永远不会执行。同时这种写法会引发无限递归调用,最终导致栈溢出。正确逻辑是在函数外部调用并打印结果,或者直接在函数内逐行输出。
3. 未处理输入类型转换
readLine()获取的输入是字符串类型,直接传入函数会让n >= 0的判断逻辑异常(字符串与数字的比较规则不符合预期),必须先转成数字:
const n = parseInt(readLine(), 10);
4. 缺失main函数实现
原代码里的main()函数没有定义,而HackerRank的执行逻辑需要通过main函数触发核心功能。
修复后的完整代码
'use strict'; const fs = require('fs'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); let inputString = ''; let currentLine = 0; process.stdin.on('data', function(inputStdin) { inputString += inputStdin; }); process.stdin.on('end', function() { inputString = inputString.split('\n'); main(); }); function readLine() { return inputString[currentLine++]; } function imprimaQuadradoAsterisco(n) { // não altere a linha acima /* * Escreva nas linhas a seguir um código que * imprima um quadrado de asteríscos * de altura e largura igual ao valor de n */ if (n >= 0) { const linha = '*'.repeat(n); let quadrado = ''; for (let i = 0; i < n; i++) { quadrado += linha + '\n'; } return quadrado; } else { return "Somente números maiores ou igual a 0"; } // não altere a linha abaixo } function main() { const n = parseInt(readLine(), 10); const result = imprimaQuadradoAsterisco(n); console.log(result.trim()); // 移除末尾多余换行,匹配HackerRank输出格式 } // fim do seu código
额外说明
- 用
trim()是为了去掉结果末尾的多余换行符,避免HackerRank判定输出格式不匹配。 - 转换输入时指定
parseInt的基数为10,防止非十进制输入引发错误。
内容的提问来源于stack exchange,提问作者Gabriel Guerreiro
相关产品推荐
相关产品推荐

