JavaScript解码TXT文件:金字塔取词函数异常求助
问题分析与修正
你的代码只返回单个值,核心问题是错误计算了金字塔每层末尾的数字。原来的current_num = (current_line + 1) / 2逻辑完全不符合金字塔末尾数的规律,导致匹配完第一个数字后,后续的current_num变成非整数,无法和文件中的数字匹配,自然只能收集到第一个单词。
正确的金字塔末尾数规律
金字塔第n层的末尾数字是前n个自然数的和,公式为:n*(n+1)/2。比如:
- 第1层末尾:
1*2/2 = 1 - 第2层末尾:
2*3/2 = 3 - 第3层末尾:
3*4/2 = 6 - 以此类推,直到末尾数超过文件中的最大数字为止。
修正后的代码
function decode(message_file) { const fs = require("fs"); const data = fs.readFileSync(message_file, "utf8"); const lines = data.split("\n").filter(Boolean); // 构建数字到单词的映射表,方便快速查找 const numToWord = new Map(); let maxNum = 0; for (const line of lines) { const [numStr, word] = line.split(" "); const num = parseInt(numStr); numToWord.set(num, word); if (num > maxNum) maxNum = num; } const messageWords = []; let n = 1; while (true) { // 计算当前层的末尾数字 const endNum = n * (n + 1) / 2; if (endNum > maxNum) break; // 超过最大数字就停止循环 messageWords.push(numToWord.get(endNum)); n++; } return messageWords.join(" "); } const decodedMessage = decode("message.txt"); console.log(decodedMessage); // 输出: I love computers
代码说明
- 构建映射表:先把所有数字和对应的单词存入
Map,同时记录文件中的最大数字,避免无效循环。 - 循环计算末尾数:用
n表示金字塔的层数,通过公式计算每层末尾数字,直到超过最大数字就停止。 - 收集单词并拼接:根据末尾数字从映射表中取出对应单词,最后拼接成句子。
这样修改后,就能正确提取金字塔每层末尾对应的单词,得到预期的结果。
内容的提问来源于stack exchange,提问作者Noel Pena
相关产品推荐
相关产品推荐

