<数据结构与算法刷题心得笔记>Java-数组加一

题目要求:给定一个由 整数组成的非空 数组所表示的非负整数,在该数的基础上加一。
提供一个非空的整数数组,返回一个数组

示例 1:

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

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

输入:digits = [0]
输出:[1]

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
,这个整数不会以零开头。

解法:
一开始思考的方法是,采用转换为整数的方法,再进行拆分,但由于题目要求返回一个int数组,因此仅适合数组长度在10以下的情况,因为int能表示的最大大小为21亿,当数组长度越界时会出现无法预料的情况。

class Solution {
    public int[] plusOne(int[] digits) {
        long initValue = 0;
        int count = 0;
        int[] res;
        for (int i = 0; i < digits.length; i++){
            initValue += (digits[i])*((long)Math.pow(10, digits.length - i - 1));//Math方法默认为double
            if(digits[i] == 9){
                count++;//计算数组内有几个9
            }
        }
        long newValue = initValue + 1;
        if(count == digits.length){//全是9的情况下
            res = new int[digits.length + 1];
            res[0] = 1;
            for(int i = 1; i < digits.length + 1; i++){
                res[i] = 0;
            }
        }else{//不全为9
            res = new int[digits.length];
            for(int i = 0; i < digits.length; i++){
                res[i] = (int)(newValue / (long)(Math.pow(10, digits.length - i - 1)) % 10);
            }
        }
        return res;
    }
}

思路2:采用进位思想,若为9则进位carry为1,还需要再进行更高位的计算,直到无进位为止
如果数组中的所有元素都是9,类似9999,加1之后肯定会变为10000,也就是数组长度会增加1位。
如果数组的元素只要有一个不是9,加1之后直接返回即可。

class Solution {
    public int[] plusOne(int[] digits) {
        if(digits == null || digits.length == 0){
            return null;
        }
        int len = digits.length;
        if(digits[len - 1] != 9){
            digits[len - 1]++;
            return digits;
        }
        int carry = 1;//进位
        for(int i = len - 1; i >= 0; i--){   
            int temp =digits[i];//记录       
            digits[i] = (digits[i] + carry) % 10;
            carry = (temp + 1)/10;//计算是否进位,进位carry为1        
            if(digits[i] != 0){//计算当前是否为9,若不是可以直接返回
                return digits;
            }
        }
        //全是9的情况
        int[] newDigits = new int[len + 1];
        newDigits[0] = 1;
        for(int i = 1; i < len + 1; i++){
            newDigits[i] = 0;
        }
        return newDigits;
    }
}

进位算法:倒序循环

carry = (temp + 1)/10;//计算是否进位,进位carry为1   
digits[i] = (digits[i] + carry) % 10;//加上进位后该数字的变化

思路三:观察数是否为9,若为9,则改为0,其他全部改为+1即可

public int[] plusOne(int[] digits) {
        int length = digits.length;
        for (int i = length - 1; i >= 0; i--) {
            if (digits[i] != 9) {
                //如果数组当前元素不等于9,直接加1
                //然后直接返回
                digits[i]++;
                return digits;
            } else {
                //如果数组当前元素等于9,那么加1之后
                //肯定会变为0,我们先让他变为0
                digits[i] = 0;
            }
        }
        //除非数组中的元素都是9,否则不会走到这一步,
        //如果数组的元素都是9,我们只需要把数组的长度
        //增加1,并且把数组的第一个元素置为1即可
        int temp[] = new int[length + 1];
        temp[0] = 1;
        return temp;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值