Leetcode第66题——加一

一、问题描述

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

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

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

示例 1:

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

示例 2:

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

问题解释:

1.这里面的单个数字:指的是每个数组元素里面,只能存储的是0,1,2,3,4,5,6,7,8,9这10个数字。

2.除了整数0之外,这个整数不会以零开头:如果有进位,该数组的首位是10,这个时候应该把数组的长度增加1,数组的开头,用两个存储单元分别存储1和0。

二、题解

1.解决思路

这个题的关键在于,如果低位数字是9的话,考虑进位的问题。这个时候,之前的低为数字变为0,比它高1位的数字加1.举个例子:

输入:[9,6,2,0,0,4,6,2,4,9]; 

输出:[9,6,2,0,0,4,6,2,5,0]

解释:输入数组表示数字 9620046249。

我开始的思路是这样的:

(1)遍历整个数组的元素,得到该数组表示的实际数字是几

(2)把该数字加1

(3)把加1后的数字,得到每一位数字,最后存储到数组中去。

这种思路忽略了一点:计算机中int类型占4个字节,它能表示的数的最大值是2的31次方-1,即2147483647。所以,当得到的实际数字大于该值时,这种方法行不通。

我们不难发现,加1是从后往前改变数组的元素的值,当不产生进位的时候,只是改变最后一位,产生进位时,低位变成0,高位数字在原来的基础上加1,所以,我们没有必要知道这个数字到底是多大,只需要根据是否产生进位改变数组中元素的值就行。

思路2:

(1)逆序遍历该数组,判断数组中的元素大小,如果digits[i]>=9 ,把该位置元素赋值为0,否则将该位置元素加1,并退出循环。

(2)判断数组的最高为数字是否为0,若为0说明产生了进位,此时新建一个数组result,大小为digits.length+1,把result[0]赋值为1。

(3)返回result数组。

2.代码实现

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length-1; i >= 0 ; i--) {
            if (digits[i]>=9 ){
                digits[i] = 0;
            }else {
                digits[i] = digits[i]+1;
                break;
            }
        }

        int[] result = digits;
        if (digits[0]==0){
            result = new int[digits.length+1];
            result[0] = 1;
        }

        return result;
    }

 

你可能感兴趣的:(leetcode)