题目

标题和出处

标题:加一

出处:66. 加一

难度

3 级

题目描述

要求

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 数组题目:加一 - 图1 之外,这个整数不会以零开头。

示例

示例 1:

输入:数组题目:加一 - 图2
输出:数组题目:加一 - 图3
解释:输入数组表示数字 数组题目:加一 - 图4

示例 2:

输入:数组题目:加一 - 图5
输出:数组题目:加一 - 图6
解释:输入数组表示数字 数组题目:加一 - 图7

示例 3:

输入:数组题目:加一 - 图8
输出:数组题目:加一 - 图9

数据范围

  • 数组题目:加一 - 图10
  • 数组题目:加一 - 图11

解法

思路和算法

将一个非负整数加一,得到的新数的长度可能和原数的长度相同,也可能比原数的长度多 数组题目:加一 - 图12 位。只有当原数的每一位都是 数组题目:加一 - 图13 时,新数的长度才会比原数的长度多 数组题目:加一 - 图14 位。

模拟加法过程即可。首先将数组 数组题目:加一 - 图15 的右边第一位加 数组题目:加一 - 图16,如果在更新之后,第一位大于 数组题目:加一 - 图17,则产生进位,将第二位加 数组题目:加一 - 图18,第一位保留个位。如果在进位操作之后,第二位大于 数组题目:加一 - 图19,则继续处理进位,直到处理到最高位,或者进位不再产生大于 数组题目:加一 - 图20 的位。

如果最高位大于 数组题目:加一 - 图21,则新数的长度比元素的长度多 数组题目:加一 - 图22 位,新数只有最高位是 数组题目:加一 - 图23,其余每一位都是 数组题目:加一 - 图24,因此创建新数组,将新数组的最高位设为 数组题目:加一 - 图25 并返回。

如果最高位不大于 数组题目:加一 - 图26,则返回更新后的数组 数组题目:加一 - 图27

代码

  1. class Solution {
  2. public int[] plusOne(int[] digits) {
  3. int length = digits.length;
  4. int index = length - 1;
  5. digits[index]++;
  6. while (index > 0 && digits[index] > 9) {
  7. digits[index - 1] += digits[index] / 10;
  8. digits[index] %= 10;
  9. index--;
  10. }
  11. if (digits[0] > 9) {
  12. digits = new int[length + 1];
  13. digits[0] = 1;
  14. }
  15. return digits;
  16. }
  17. }

复杂度分析

  • 时间复杂度:数组题目:加一 - 图28#card=math&code=O%28n%29&id=ChsQC),其中 数组题目:加一 - 图29 是数组 数组题目:加一 - 图30 的长度。需要反向遍历数组 数组题目:加一 - 图31 一次,更新数组中的元素或者创建新数组。
  • 空间复杂度:数组题目:加一 - 图32#card=math&code=O%281%29&id=m5pQm)。除了返回值以外,使用的空间复杂度是常数。