当前位置: 代码迷 >> 综合 >> Leetcode第66题——加一
  详细解决方案

Leetcode第66题——加一

热度:96   发布时间:2024-02-08 17:29:34.0

一、问题描述

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

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

你可以假设除了整数 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;}