数组转数字后超长度变0或NaN?LeetCode加一问题求助
LeetCode「加一」代码问题解析
问题代码
const digits = [5,2,2,6,5,7,1,9,0,3,8,6,8,6,5,2,1,8,7,9,8]; var plusOne = function(digits) { var value; var numbers; value = digits.join(''); value = Number(value); value += 1; numbers = Array.from(String(value), Number); return numbers; }; console.log(plusOne(digits)); // Output => [5,2,2,6,5,7,1,9,0,3,8,6,8,6,5,2,0,0,0,0,0]
问题原因解析
末尾变0:数字精度丢失
JavaScript里的Number类型采用双精度浮点数存储,它能准确表示的最大整数是2^53 - 1(即9007199254740991)。你的digits数组转成数字后是522657190386865218798,远超过这个安全值,转成Number时会丢失精度,无法准确保存原始数值。加1操作后,错误的数值转成字符串再拆分,就出现了末尾为0的错误结果。长度超21位出现NaN:超出Number的表示范围
当digits长度超过21位时,对应的数值会超出Number类型能表示的最大范围(Number.MAX_VALUE约为1.79e308),此时转成Number会得到Infinity。把Infinity转成字符串是"Infinity",用Array.from拆分并转成数字时,非数字字符(如I、n等)会被转为NaN,最终数组里就会出现NaN。
正确实现思路
直接对数组逐位处理加一和进位,避开大数字的精度问题:
var plusOne = function(digits) { // 从最后一位开始遍历处理 for (let i = digits.length - 1; i >= 0; i--) { digits[i]++; // 未进位直接返回结果 if (digits[i] < 10) { return digits; } // 进位后当前位设为0,继续向前处理 digits[i] = 0; } // 所有位都进位的情况(比如[9,9,9]),在数组头部加1 digits.unshift(1); return digits; };
内容的提问来源于stack exchange,提问作者AskingLotsOfQuestions
相关产品推荐
相关产品推荐

