加一

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

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

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

示例 1:

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

示例 2:

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

(1)遍历法
1,从数组末尾开始反向遍历数组,看是否有进位;进位初始为1;
2,建立新数组,比原数组长度加1存放结果;互相对应位置为原数组当前位置加一;
3,遍历,如果有进位,也就是原数组当前位置数字为9,则将结果数组当前位置数置为0;否则没进位,那么就将原数组的当前位值加上进位值(开始时初始为1)存放到结果数组对应位置,并且将进位值置为0;(其实也就是从这个位置开始,后续只是将原数组的数放到了新数组中而已);
4,遍历完成,如果进位值为1,其实就是把结果数组的第一个数置为1,后续全部置为0,原数组是一个全为9组成的数组;如果进位值为0,那么,就将结果数组长度其实和原数组一样的,则将头一位截掉,复制后半段即可;

class Solution {
    public int[] plusOne(int[] digits) {
       //判断最高位是否等于10也就是有进位
        int carry = 1;//表示是否有进位
        //新建结果数组统计结果
        int len = digits.length;
        int[] res = new int[len+1];
        //遍历数组,存到结果数组,层层判断是否有进位
        for (int i = len; i > 0; i --) {
            //判断有进位则前一位加一
            if (digits[i-1]+carry >= 10)
                //res当前位置的数字为0
                res[i] = 0;
            else{//否则全程没有进位(除了初始加1)
                res[i] = digits[i-1] + carry;
                carry = 0;
            }
        }
        //如果遍历完成还有进位
        if (carry == 1)
            res[0] = 1;
        else
            //否则就将结果数组由1开始到完成复制一份即可
            res = Arrays.copyOfRange(res,1,len+1);
        return res;
    }
    }

注意:全是9的数组的特殊情况处理;

(2)递归法
1,全是9的数组也就是,递归到index==0,此时就需要新建结果数组,长度为原数组加1,并且将开头置为1即可;
2,当前位置上的数小于9,那就在原数组当前位置数值加一,然后返回原数组即可;
3,当前位置上的数字为9,并且index也不等与0,则继续向前递归即可,就是有进位的情况了;

class Solution {
    public int[] plusOne(int[] digits) {
        return add(digits, digits.length-1);
        }
   //递归
    private int[] add(int[] digits, int index) {
        //如果递归一直进行到index==0,说明原数组长度不够,并且第一个数需要进位,并且其余数肯定都是0;
        if (index == 0 && digits[0] == 9) {
            //需要新的空间存储
            int[] res = new int[digits.length + 1];
            //并且它的第一位是1,第二位是0
            res[0] = 1;
            return res;
        }
        //不存在进位则直接末尾数加一返回
        if (digits[index]<9) {
            digits[index] += 1;
            return digits;
        }
        //要一直向前进位,则递归
        else {
            //当前位数置为0
            digits[index] = 0;
            return add(digits,index-1);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值