Plus One

https://leetcode.com/problems/plus-one/

Given a non-negative number represented as an array of digits, plus one to the number.

The digits are stored such that the most significant digit is at the head of the list.

解题思路:

这题的基本思路很简单,就是考基本的按位加法和进位。每位都要加上前面的进位,然后除以10,余数就是当前位的结果,商就是进位。

因为需要返回一个数组,就要考虑最高位是否会进位,因为如果进位,结果的数组就会比原来数组的位数多1。那么什么情况最高位会进位?因为只加上1,所以只有当原来数字为9999,即全是9的时候,加上1最高位才会进位。

所以下面的解法预先判断最高位是否会进位,然后根据需要声明了一个result的数组,再将结果从低位到高位写入result。

public class Solution {

    public int[] plusOne(int[] digits) {

        int[] result;

        if(isAllNine(digits)){

            result = new int[digits.length + 1];

        }else{

            result = new int[digits.length];

        }

        

        int carry = 0;

        for(int i = 0; i < digits.length; i++){

            if(i == 0){

                result[result.length - 1 - i] = (digits[digits.length - 1 - i] + carry + 1) % 10;

                carry = (digits[digits.length - 1 - i] + carry + 1) / 10;

            }else{

                result[result.length - 1 - i] = (digits[digits.length - 1 - i] + carry) % 10;

                carry = (digits[digits.length - 1 - i] + carry) / 10;

            }

        }

        if(result.length > digits.length){

            result[0] = 1;

        }

        return result;

    }

    

    public boolean isAllNine(int[] digits){

        for(int i = 0; i < digits.length; i++){

            if(digits[i] != 9){

                return false;

            }

        }

        return true;

    }

}

下面是一个更好点的解法,我们看到从低位到高位计算,如果任何一位不进位了,就代表计算已经结束。这样我们可以省去后面的计算,而且完全可以在digits本身in place计算了。

只有当一直算到最后,算到最高位进位还未1的时候,还需要开辟一个新的数组,长度+1。而且,这时也无需从最后一位开始算起,因为最高位需要进位,原来的数组一定是N个9。所以这时只要将最高位置为1,后面全部留0就可以。

public class Solution {

    public int[] plusOne(int[] digits) {

        int carry = 1;

        for(int i = digits.length - 1; i >=0; i--){

            //必须要把sum先存下来,因为后面digits[i]会被更新

            int sum = digits[i] + carry;

            digits[i] = sum % 10;

            carry = sum / 10;

            

            if(carry == 0){

                return digits;

            }

        }

        int[] result = new int[digits.length + 1];

        result[0] = 1;

        return result;

    }

}

 从这道题上,我们可以看到,虽然问题简单,但如何在有限的范围内,最优化算法,将代码变得简单,也是一门功夫。

你可能感兴趣的:(one)