题目描述:
题目分析
小学加法题,过。
题解1:
(首先自己的题解)思路很简单就是把原来的int数组变成int(坑,稍后再说),然后加1,最后再变成int数组返回。
class Solution {
public int[] plusOne(int[] digits) {
int num = 0;
for (int d : digits) {
num = num * 10 + d;
}
num++;
List<Integer> list = new ArrayList<>();
while (num > 0) {
list.add(num % 10);
num = num / 10;
}
int[] result = new int[list.size()];
for (int i = list.size() - 1; i >= 0; i--) {
result[list.size() - 1 - i] = list.get(i);
}
return result;
}
}
这么简单的题目肯定“啪”的一下,很快,就一遍过(flag~)。
结果被现实打了脸。
看这结果,错的有点离谱哇。
再看看输入的测试用例,好家伙,原来是 int 溢出了。大意了啊。
那就改成long类型来计算吧。
class Solution {
public int[] plusOne(int[] digits) {
long num = 0;
for (int d : digits) {
num = num * 10 + d;
}
num++;
List<Integer> list = new ArrayList<>();
while (num > 0) {
list.add( Integer.valueOf((num % 10) + ""));
num = num / 10;
}
int[] result = new int[list.size()];
for (int i = list.size() - 1; i >= 0; i--) {
result[list.size() - 1 - i] = list.get(i);
}
return result;
}
}
提交,通过(才怪)!
好家伙,这是什么天才测试用例???题目明明写着 :
你可以假设除了整数 0 之外,这个整数不会以零开头。
那这个[0,0]、[0,1]怎么算?二进制?
算了不吐槽了,这道题虽然测试用例很迷,但是既然有人的题解能通过,那我就换个解法。以下。
题解2:
(还是自己的题解)既然不能按照小学生的思路去解,那就循环一下,模拟加法运算,注意一下进位就行了。
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i] = ++digits[i];
return digits;
} else {
digits[i] = 0;
if (i == 0) {
int[] re = Arrays.copyOf(digits, digits.length + 1);
re[0] = 1;
System.arraycopy(re, 1, digits, 0, digits.length);
return re;
}
}
}
return digits;
}
}
终于通过了
这道题(这类题)需要注意的是 int 溢出这个坑,至于测试用例…算了