LeetCode刷题记录之加一

114 阅读2分钟

1.1 加一

1.1.1 题目描述

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

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

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

示例 1:

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

示例 2:

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

1.1.2 基本思路

首先,我们通过阅读题目描述得知。测试用例中提供的数组不包含空数组,所以我们不需要对空数组进行判断。

按照题意,我们要对数组中的元素进行加1。那么,一共会存在三种情况,

第一种:数组中元素全部由非9组成,如1234,那么加1的结果就为1235.

第二种: 数组中的元素存在9,但是9的个数小于数组的总长度,如1299,那么加1的结果就为1300

第三种: 数组中的元素全部由9组成,如果9999,加1后的结果为10000

其次,在我们代码中要分别这三种情况进行处理,我们应该如何对这几种情况进行区分呢?重点在于9这个数字加1的话,就变成了10。如果我们将数组中的元素对10进行取余,如果取余的结果为0说明当前的数字就为0,反之不为9。

上面的内容,可以进行区分第一种和第二种情况,那么我们如何区分第三种数组中全部为9的情况呢?我们可以对数组重尾到头进行遍历,如果数组的所有元素对10取余的结果都是0,说明就是第三种情况。这种情况我们需要新开辟一个数组,新数组的长度为原数组长度+1,新数组的首元素为1,其余元素为0。

1.1.3 代码实现

1.1.3.1 解法1(时间复杂度O(n),空间复杂度O(n))


class Solution {
    public int[] plusOne(int[] digits) {
        for(int i = digits.length - 1; i >= 0; i--){
            //对数组元素进行+1
            digits[i]++;
            //数组对10进行区域,来判断当前数字是否为9
            digits[i] = digits[i] % 10 ;
            //当前数字如果不为9,我们之前返回也就是上面说的第一种或者第二种情况
            if(digits[i] != 0){
                return digits;
            }
        }
        //如果走到这个部分,就是上面说的第三种情况,也就是数字全部为9
        digits = new int[digits.length + 1];
        digits[0] = 1;
        //当前情况,除了第一位是1以外,其他位都是零
        return digits;
    }
}