排查JavaScript数组中2的幂元素索引提取算法的逻辑缺陷
问题分析与修复
你的代码核心缺陷是直接跳过了所有奇数,但1是奇数同时也是2的幂(2⁰),所以被错误排除了。
缺陷拆解
原代码中这一行直接跳过所有奇数:
if (arr[i] % 2 !== 0) continue;
这导致测试用例里索引0的1被直接跳过,而它本应被纳入结果数组。
修复方案
这里提供两种可行的修正方式:
方案1:兼容原逻辑,补上1的特殊判断
保留你原本的除法验证逻辑,先单独处理1的情况,再过滤非1的奇数:
function secondPower(arr) { let powers = []; let x; for (let i = 0; i < arr.length; i++) { const num = arr[i]; // 1是2^0,属于2的幂 if (num === 1) { powers.push(i); continue; } // 非1的奇数直接跳过 if (num % 2 !== 0) continue; x = num; do { x = x / 2; } while (x % 2 === 0); if (x === 1) powers.push(i); } return powers; }
方案2:用位运算高效判断2的幂
2的幂(大于0的正整数)有个特性:num & (num - 1) === 0,这个方法更简洁高效,同时天然兼容1的情况:
function secondPower(arr) { let powers = []; for (let i = 0; i < arr.length; i++) { const num = arr[i]; // 2的幂需满足:大于0,且按位与自身减1结果为0 if (num > 0 && (num & (num - 1)) === 0) { powers.push(i); } } return powers; }
测试验证
运行测试用例secondPower([1,2,3,4,5,6,7,8,9,10]),两种方案都会返回预期结果:[0, 1, 3, 7],符合需求。
内容的提问来源于stack exchange,提问作者Mr Chasi
相关产品推荐
相关产品推荐

