[LeetCode] 66. Plus One

原题链接:https://leetcode.com/problems/plus-one/

1. 题目介绍

Given a non-empty array of digits representing a non-negative integer, plus one to the integer.

The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.

You may assume the integer does not contain any leading zero, except the number 0 itself.

给出一个非空数组代表了一个非负数,给这个数加一。
你可以假设没有前导0,除非是数字0本身。
Example 1:

Input: [1,2,3]
Output: [1,2,4]
Explanation: The array represents the integer 123.

Example 2:

Input: [4,3,2,1]
Output: [4,3,2,2]
Explanation: The array represents the integer 4321.

2. 解题思路

这道题最先想到的方法就是堆栈,栈底存放低位的数字,栈顶存放高位的数字。将数加1,可以看作进位carry 一开始就是1. 接着从后向前遍历数组,将每一位的值和进位值相加,取个位放入堆栈,取十位为新的进位值。最后再新建一个数组,将堆栈里面存放的数依次弹出来,弹出的顺序就是从高位到低位了。

这个题有一个常见的错误做法,就是把数组的数转化成一个 int 或者 long 类型的数,然后加1,再将加完1后的数转化为数组。这种方法我没有尝试,不知道能不能成功。即使能够成功,这种做法也不是出题人要考察的本意。因为无论是int类型也好,long类型也好,它们都是有位数限制的,超过了32位/64位就会溢出。而数组可以表示的数当然不止有32位/64位。所以这种方法是不行的。

实现代码

class Solution {
    public int[] plusOne(int[] digits) {
        Stack<Integer> st = new Stack<Integer>();
        int carry = 1;
        for(int i = digits.length - 1 ; i>=0 ; i--){
            int sum = digits[i] + carry;
            carry = sum /10;
            st.push(sum%10);
        }
        if(carry != 0){
            st.push(carry);
        }
        
        int [] ans = new int [st.size()];
        for(int i = 0;i<ans.length;i++){
            ans[i] = st.pop();
        }
        return ans;
    }
}

当然,如果不用堆栈,完全也可以做出来这个题,甚至时间也会更快一些。从后向前遍历原数组,将每一位的值和进位值相加,取个位放入原数组的对应位置,取十位为新的进位值。
遍历完数组后,如果进位值为0,那么直接返回数组;如果进位值不为零,那么新建一个比原数组长度多1位的新数组,将进位值放入新数组的第0个位置,然后复制原数组。

实现代码

class Solution {
    public int[] plusOne(int[] digits) {
        int carry = 1;
    
        for(int i = digits.length - 1 ; i>=0 ; i--){
            if(carry == 0 ){
                break;
            }
            int sum = digits[i] + carry;
            carry = sum /10;
            digits[i] = sum % 10;
        }
        
        if(carry == 0){
            return digits;
        }else{
            int [] ans = new int [ digits.length + 1 ];
            ans[0] = carry;
            for(int i = 1 ; i<ans.length ; i++){
                ans[i] = digits[i-1];
            }
            return ans;
        }
     
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值