You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组转数字后超长度变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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:54:16