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;
}
}