每日一题-数组 *leetcode 66

214 阅读1分钟

一、题目描述

二、提交代码

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

        int digit =0;
        for(int i=0;i<digits.length;i++){
            digit += ((int)Math.pow(10,digits.length-1-i))*digits[i];
        }
        String str0 = Integer.toString(digit);
        String str = Integer.toString(digit+1);
        int size =0;
        if(str0.length()<str.length()){
            size = digits.length+1;
        }else{
            size = digits.length;
        }
        int[] result = new int[size];
        for(int j=0;j<str.length();j++){
            result[j] = Integer.parseInt(str.substring(j,j+1));
        }
        return result;
    }
}

三、存在问题

测试用例长度过大,超过int表示范围,未通过

四、优解代码

class Solution {
    public int[] plusOne(int[] digits) {
        for(int i =digits.length-1;i>-1;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;
    }
}

五、代码思路

  1. 只有当原数组组成的数字为9,99,999,...时,加一后需要进位,同时结果数组尺寸加一
  2. 其他情形,只需要末尾元素加一即可
  3. 因此数组的判断标准即

原数组每一位被进位后对10取余是否为0,如果为0则代表属于9,99,999,...的情形,需要扩大结果数组的尺寸

否则,对于普通情形不需要进位的,只需令最后一位数字加一,对于普通情形需要进位的,需要令最后一次进位的数字加一,其后的数字变0