无需模运算判断奇数的JS代码Replit运行正常,控制台超时是代码问题吗
不使用模运算判断奇数的代码问题与优化方案
原有代码的问题
原有代码存在核心逻辑缺陷,是触发超时的直接原因:
- 未处理负整数输入:负数执行
Math.floor(负数/2)运算时,最终会收敛到-1,永远无法满足循环终止条件result===0或result===1,直接进入死循环导致超时。你在Replit测试的100007是正整数,所以能正常运行,一旦输入负整数就会触发超时问题。 - 运算效率存在冗余:对于极大正整数输入,循环次数为log2(n),虽然整体复杂度不高,但远不如常量级方案高效。
原有逻辑的修复版本
如果要保留原来的循环除2的思路,只需要提前对输入取绝对值即可解决死循环问题:
function isOddWithoutModulo(num) { let result = Math.abs(num); while(result !== 0 && result !== 1){ result = Math.floor(result / 2); } return result === 1; }
更优的替代实现方案
位运算方案(最优)
利用奇数二进制末位固定为1的特性,和1做按位与运算,时间复杂度为O(1),天然兼容正负整数:
function isOddWithoutModulo(num) { return (num & 1) === 1; }
整除判断方案
利用奇数减1后可被2整除的特性实现,不需要循环:
function isOddWithoutModulo(num) { return Number.isInteger((num - 1) / 2); }
内容的提问来源于stack exchange,提问作者Yavuz Abasiyanik
相关产品推荐
相关产品推荐

