Loading

加一

1.问题描述

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:digits = [0]
输出:[1]

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

2.求解

愚蠢的解法

代码如下

    /*
     *执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
     *内存消耗:37 MB, 在所有 Java 提交中击败了68.27% 的用户
     */
	public int[] plusOne(int[] digits) {
        int n = digits.length - 1;
        int num = digits[n] + 1;
        int carryFlag = num / 10;
        int endNum = num % 10;
        digits[n] = endNum;
        while(carryFlag != 0){
            if(n == 0){
                digits[0] = 0;
                return newNum(digits);
            }else{
                n--;
                num = digits[n] + 1;
                carryFlag = num / 10;
                endNum = num % 10;
                digits[n] = endNum;
            }
        }
        return digits;
    }

    private int[] newNum(int[] num){
        int n = num.length;
        int[] newNum = new int[n + 1];
        newNum[0] = 1;
        for(int i = 0; i < n; i++){
            newNum[i + 1] = num[i];
        }
        return newNum;
    }

优雅的解法

仔细分析一下,共有两种情况

  1. 自增后,当前位对10取余为0,需要进位,继续循环自增下一位
  2. 自增后,当前位对10取余不为0,不需要进位,加一结束,直接返回digits

其中第一种情况的极端情况时遍历完成时,仍没有返回数组digits说明此时digits数组中数字均为0,于是创建一个长度比digits大1的数组,将它的第一位赋值为1返回即可(在方法中的变量称为域变量,会自动的被赋值为默认值,int的默认值是0)

代码如下

    /*
     *执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
     *内存消耗:37 MB, 在所有 Java 提交中击败了68.69% 的用户
     */
	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;
    }
posted @ 2020-11-18 19:16  水纸杯  阅读(242)  评论(0)    收藏  举报