Java&LeetCode 初入门——066. 加一

Java&LeetCode 初入门——066. 加一

文内代码全部采用JAVA语言。

题目

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

测试用例

示例 1:

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

示例 2:

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

个人解法

这个题目看得我懵逼。加1就加1,还要把好好地数字写成数组,真是气死人,增加无谓的负担。像我这么头脑简单的小白,最开始的想法就是:直接把数组转成数字再+1,最后在再转回来。事实证明,我还是too young too 天真。提交时直接给我来了个巨巨巨长的数组,直接超出long的范围,不得已放弃。

遂采用进位检查的办法,在最末位+1,检查该位置是否有进位,并高位依次检查是否有进位,如果溢出,如999 +1,已经超出原有数组长度,只能写新数组重新安放数据。(如果有哪位仁兄知道有什么内置方法可以在数组最前面插入数字,麻烦留言告知)。

思路反正很简单,在最低位+1,如果不需要进位,直接返回数组;需要进位就依次检查进位情况。最高位溢出就重新安放数据后返回,没有溢出直接返回。
执行用时: 1 ms, 在Plus One的Java提交中击败了49.61% 的用户。emmm,我也不造说啥了,大家可能都只需要0ms。

class Solution {
    	public int[] plusOne(int[] digits) {
		int length=digits.length;
		digits[length-1]=digits[length-1]+1;
		if (digits[length-1]!=10) {
			return digits;
		}
		for (int i1 = digits.length-1; i1>0; i1--) {
			if (digits[i1]==10 ) {
				digits[i1]=0;
				digits[i1-1]+=1;
			} 
		}
		if (digits[0]==10) {
			int[]ans=new int[length+1];
			ans[0]=1;
			ans[1]=0;
			for (int j = 2; j < digits.length; j++) {
				ans[j]=digits[j];
			}
			return ans;
		}
		return digits;

	}
}

个人觉得就三种情况,自己测试的话可以测试 以下几个用例: {1},{9},{1,2},{1,9},{9,9}。如果这几个没问题的话,那应该就差不多了。

大神解法

依旧没有官方解法,大神解法来代班。

思路

思路和个人解法相同,就是竖式加法的思路。写法相当简洁,学习一下。

算法

非常巧妙,从最低位开始检测,一旦不需要进位就直接跳出循环,如果需要进位再依次向高位检查。如果最高位是9,并且有从低位来的进位,那么说明后面每一位都有进位,每一位都是9,直接返回最高位为1,其余位为0的数组。

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            if (digits[i] == 9) {
                if (i == 0) {
                    int[] result = new int[digits.length + 1];
                    result[0] = 1;
                    return result;
                }
                digits[i] = 0;
            } else {
                digits[i] += 1;
                break;
            }
        }
        return digits;
    }
}

执行用时: 0 ms, 在Plus One的Java提交中击败了100% 的用户。
这个应该是最佳解法了。

猜你喜欢

转载自blog.csdn.net/qq_27480345/article/details/86306569
今日推荐