[66] Plus One

来源:互联网 发布:工作室软件 编辑:程序博客网 时间:2024/06/05 19:54

1. 题目描述

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.

给定一个数组,数组每一位都是一个0-9的数字,给这个数组加1。如{1,2,3,4,5} -> {1,2,3,4,6}。

2. 解题思路

这个题主要就是考察进位的问题,十进制的进位制度大家都知道,当当前最后一位是9的时候加1向前进位,不是9就直接在最后一个数字上加1。那么简单的思想就是使用一个循环,从后面往前逐级进位就好了,但是这时候就有一个问题,当数字为9,99,999等等全是9的数字时,进位产生的数组长度是会加1的,也就是从{9,9,9}->{1,0,0,0},这样就需要将数组扩容1位,也就需要进行判断和复制操作。判断时我使用了判断第一位是否为0且是否之前进位到了第1位的方式,其实也可以使用一个flag,在循环内部停止进位时标记为true,之后在外面直接进行判断即可。

3. Code

public class Solution {    public int[] plusOne(int[] digits) {        // 从后往前进位        int i;        for(i = digits.length - 1; i >= 0; --i)        {            if(digits[i] != 9)            {                digits[i] += 1;                break;            }            digits[i] = 0;        }        // 如果第一位也产生进位生成一个新的长度加1的数组        if(i == -1 && digits[0] == 0)        {            int [] newDigits = new int[digits.length + 1];            newDigits[0] = 1;  // 第一位设为1            // 后面为设为进位完的原数组            // public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);            System.arraycopy(digits, 0, newDigits, 1, digits.length);  // 使用自带的拷贝函数            /*for(int j = 0; j < digits.length; ++j)            {                newDigits[j+1] = digits[j];            }*/            digits =  newDigits;        }        return digits;    }}
0 0