代码训练营申请遇阻:筛选有效灯泡序列号代码求助
编程题错误排查与修正
题目描述
吉姆打算购买一批混合灯泡,当灯泡的序列号为奇数且恰好是6位数字时,灯泡效率最高。请编写代码从给定的serialNumbers数组(示例:[32438, 34193, 149143, 4329429, 98537, 238791, 23492, 298342])中筛选符合条件的序列号,存入efficientSerialNumbers变量,正确结果应为[149143, 238791]。
我的代码
function findEfficientBulbs(serialNumbers) { console.log(serialNumbers) const efficientSerialNumbers = []; // Write your code here for (let i= 0 ; i < serialNumbers.length ; i++) if (serialNumbers[i].length <=5 || serialNumbers[i].length >=7) { serialNumbers[i].shift() } else if (serialNumbers[i] % 2 === 1 && serialNumbers[i].length === 6 ) { serialNumbers[i].shift() efficientSerialNumbers.unshift(serialNumbers[i]) } console.log(efficientSerialNumbers) console.log(serialNumbers) return efficientSerialNumbers; }
测试输出
4项测试通过,1项失败:
should return an array ✓ Well done! logs [ 123123 ] [] [ 123123 ] should discard serial numbers with five or fewer figures ✓ Well done! logs [ 1, 123, 12345 ] [] [ 1, 123, 12345 ] should discard serial numbers with seven or more figures ✓ Well done! logs [ 1234567, 123456789 ] [] [ 1234567, 123456789 ] should discard even numbers ✓ Well done! logs [ 1234, 123456, 12345678 ] [] [ 1234, 123456, 12345678 ] should keep all efficient numbers - those that are odd and have six digits in ✕ AssertionError: expected [] to deeply equal [ 234567, 456789 ] logs [ 123456, 234567, 345678, 456789 ] [] [ 123456, 234567, 345678, 456789 ]
问题分析
- 数字无length属性:数组元素是数字类型,直接调用
.length会返回undefined,导致所有长度判断逻辑完全失效。 - 错误调用shift():
shift()是数组方法,用来删除数组首元素,对单个数字调用该方法毫无意义,还会触发隐性错误。 - 逻辑判断顺序混乱:先判断长度不符合的情况,但因长度判断失效,后续符合条件的数字也无法进入筛选分支。
- unshift()使用不当:虽然不影响结果正确性,但用
unshift()添加元素会逆序存储,通常筛选场景用push()更符合直觉。
修正后的代码
循环版
function findEfficientBulbs(serialNumbers) { console.log(serialNumbers) const efficientSerialNumbers = []; for (let i = 0; i < serialNumbers.length; i++) { const num = serialNumbers[i]; // 两种方式判断6位数:转字符串取长度,或用数值范围 const isSixDigit = num.toString().length === 6; // const isSixDigit = num >= 100000 && num <= 999999; const isOdd = num % 2 === 1; if (isSixDigit && isOdd) { efficientSerialNumbers.push(num); } } console.log(efficientSerialNumbers) console.log(serialNumbers) return efficientSerialNumbers; }
更简洁的filter版
function findEfficientBulbs(serialNumbers) { console.log(serialNumbers) const efficientSerialNumbers = serialNumbers.filter(num => { const str = num.toString(); return str.length === 6 && num % 2 === 1; }); console.log(efficientSerialNumbers) console.log(serialNumbers) return efficientSerialNumbers; }
修正说明
- 通过转字符串或数值范围判断,正确识别6位数字。
- 保留奇数判断逻辑,确保筛选条件准确。
- 使用
push()或filter()正确收集结果,不再错误修改原数组。
内容的提问来源于stack exchange,提问作者Room4Renzo
相关产品推荐
相关产品推荐

