【嘎】数组-加一

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

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

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

  输入: [1,2,3]
  输出: [1,2,4]
  解释: 输入数组表示数字 123。
示例 2:

  输入: [4,3,2,1]
  输出: [4,3,2,2]
  解释: 输入数组表示数字 4321。

解答: step1 一开始用了int接收origin,后来用了long,但还是会有溢出的问题,所以这种做法是不对的

 1 class Solution {
 2     public int[] plusOne(int[] digits) {
 3         long origin = 0L;
 4         for (int i = 0; i < digits.length; i++) {
 5             origin = (origin * 10) + digits[i];
 6         }
 7         String res = (origin + 1) + "";
 8         int arr[] = new int[res.length()];
 9         for (int i = 0; i < res.length(); i++) {
10             arr[i] = Integer.parseInt(res.charAt(i) + "");
11         }
12         return arr;
13     }
14 }

然后换成了下面的写法,其中错了两次,忘记会有进位了:

 1 class Solution {
 2     public int[] plusOne(int[] digits) {
 3         int plus = 1;
 4         for (int i = digits.length - 1; i >= 0;i--) {
 5             if (digits[i] <= 8) {
 6                 if (plus == 1) {
 7                     digits[i] = digits[i] + plus;
 8                     break;
 9                 } else {
10                     break;
11                 }
12             } else {
13                 digits[i] = 0;
14                 plus = 1;
15                 // 错误1:[9],需要进位的,数组长度要加一
16                 if (i == 0) {
17                     int[] res = new int[digits.length + 1];
18                     res[0] = 1;
19                     for (int j = 1;j < res.length; j++) {
20                         res[j] = digits[j-1];
21                     }
22                     // 错误2:忘记返回了
23                     return res;
24                 }
25             }
26         }
27         return digits;
28     }
29 }

然后看看别人的写法以及别人的评价,我突然觉得数组长度加一,for循环塞值是多余的了 : )

 下面这位精选:

根据题意加一,没错就是加一这很重要,因为它是只加一的所以有可能的情况就只有两种:

除 99 之外的数字加一;
数字 99。
加一得十进一位个位数为 00 加法运算如不出现进位就运算结束了且进位只会是一。

所以只需要判断有没有进位并模拟出它的进位方式,如十位数加 11 个位数置为 00,如此循环直到判断没有再进位就退出循环返回结果。

然后还有一些特殊情况就是当出现 9999、999999 之类的数字时,循环到最后也需要进位,出现这种情况时需要手动将它进一位。

Java
class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }
}

 

越努力越幸运~ 加油ヾ(◍°∇°◍)ノ゙
原文地址:https://www.cnblogs.com/utomboy/p/12449475.html