Leetcode-66 加一

一、问题描述

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

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

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

示例 1:

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

示例 2:

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

二、解题思路

开始有两个想法,一个是转成字符串,然后按位去做,另一个是从后往前遍历数组,依次计算每个数位,后来突然意识到这道题仅仅是在原来的数组表示的数的基础上加一,不用如此大费周章。

1)当数组最后一个元素不为9,表示无需进位,只需在原数组上把最后一个元素+1,返回这个数组即可。

2)当最后一个元素为9,表示需要进位,通过一个boolean变量表示是否需要进位,当需要进位时就将前一位元素+1,通过一个循环处理这样的数字,直到不需要进位了,此时前面的数字无需修改,直接返回当前数组即可。

3)当循环结束了,有两种情况:第一种是最高位不为0,表示数字位数不变,此时直接返回当前数组;第二种是最高位为0,表示数字位数变了,因此创建一个新数组,长度为原数组+1,将首位设置成1,返回即可。

三、代码

class Solution {
    public int[] plusOne(int[] digits) {
        int n=digits.length-1;
        if(digits[n]!=9){
            digits[n]=digits[n]+1;
            return digits;
        }
        boolean carry=true;
        while(carry&&n>=0){
            int sum=digits[n]+1;
            if(sum<10)carry=false;
            digits[n]=sum%10;
            n--;
        }
        if(digits[0]!=0)return digits;
        int[] newD=new int[digits.length+1];
        newD[0]=1;
        return newD;
    }
}

四、结果

运行时间 0ms 100%
消耗内存 37.5M 5.63%

五、总结

这道题也不难,思路都会有,只不过是可能会多做许多无用的事情,要多思考。学了三天车做了三天的简单题,明天考完科目三就可以刷一些难题了。

你可能感兴趣的:(Leetcode刷题心得收获)