文内代码全部采用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% 的用户。
这个应该是最佳解法了。