HackerRank Compare the Triplets挑战中split()读取报错问题排查
问题分析与修复
1. 输入读取错误原因
你碰到的TypeError: Cannot read properties of undefined (reading 'split'),是因为readLine()没有读取到任何内容,返回了undefined,对undefined调用split()必然触发报错。
根据挑战描述,题目要求编写接收两个数组作为参数的函数,而非直接从标准输入读取数据。你当前用readLine()读取输入的写法,不符合题目的函数式要求,这是核心问题之一。
2. 变量使用错误
代码里定义了得分变量aScore和bScore,但加分时却用了未定义的a++和b++,这会引发另一个ReferenceError,必须改成aScore++和bScore++。
3. 修正后的代码
符合题目要求的函数写法
function compareTriplets(a, b) { let aScore = 0; let bScore = 0; // 循环遍历比较,避免硬编码元素 for (let i = 0; i < 3; i++) { if (a[i] > b[i]) { aScore++; } else if (a[i] < b[i]) { bScore++; } // 元素相等时不加分,无需额外处理 } return [aScore, bScore]; }
若需自行读取输入的场景(适配部分HackerRank环境)
如果确实需要读取输入,要先确保readLine()的返回值有效,同时修复变量错误:
// 先处理readLine()的返回值,避免undefined let aTemp = (readLine() || "").split(' '); let bTemp = (readLine() || "").split(' '); // 转换数组元素为数字,确保默认值 let a = aTemp.map(num => parseInt(num) || 0); let b = bTemp.map(num => parseInt(num) || 0); let aScore = 0; let bScore = 0; for (let i = 0; i < 3; i++) { if (a[i] > b[i]) { aScore++; } else if (a[i] < b[i]) { bScore++; } } console.log(aScore + ' ' + bScore);
额外优化建议
- 不要硬编码数组的三个元素,用循环遍历更通用,也符合代码规范。
- 用
map批量转换数组元素,比逐个解析更简洁高效。
内容的提问来源于stack exchange,提问作者kaylaasana
相关产品推荐
相关产品推荐

