每日一题在昨天断开了一天,是因为作者沉迷吉他,无法自拔……竟然把每日一题给忘了,所以今天,发两篇每日一题,把昨天的给补上
一、题目
二、解题思路
1、我的思路
其实乍一看这道题还是比较简单的,就是让数组的最后一个元素加1
但是再仔细想想就不难考虑到一种更加麻烦的情况——进位
如果一个数以9结尾,那么就需要将最后一位置为0,倒数第二位加1,但是如果倒数第二位也是9呢?就需要重复上述操作,将倒数第二位置为0,倒数第三位加1,但是如果倒数第三位也是9呢?如果这个数是1999999999怎么办?我只想说:禁止套娃
想到这里,我的脑海里浮现了一个思路:
将可能的情况分为3种:
1、数组中只有0:直接返回1
2、数组最后一位不是9:直接让最后一位加1,再返回原数组
3、数组最后一位是9:从后往前遍历数组,将值为9的元素全置为0,找到最靠后的一个不为9的元素时,让这个元素加1,结束循环,返回原数组
于是我写了如下代码
if(digits[0] == 0){
return new int[] {1};
}else if(digits[digits.length - 1] != 9){
digits[digits.length - 1]++;
return digits;
}else{
for (int i = digits.length-1; i >= 0 ; i--) {
if(digits[i] != 9){
digits[i]++;
break;
}else{
digits[i] = 0;
}
}
return digits;
}
但这段代码却没有通过所有的测试用例,原因是我遗漏了一种情况,如果数字是999,这就意味着遍历数组将找不到值不为9的元素,按照我的代码走一遍,最后返回的结果是000,而预期结果是1000,也就是说,我们还要加入一段代码:在找不到值不为9的元素时,数组长度加1用于存放多余的1
于是我改进了代码
if(digits[0] == 0){
return new int[] {1};
}else if(digits[digits.length - 1] != 9){
digits[digits.length - 1]++;
return digits;
}else{
int i;
for (i = digits.length-1; i >= 0 ; i--) {
if(digits[i] != 9){
digits[i]++;
break;
}else{
digits[i] = 0;
}
}
if(i == -1){
int[] arr = new int[digits.length+1];
arr[0] = 1;
return arr;
}
return digits;
}
这里有一个小知识点:
由于我们使用的是数组的动态初始化,也就是初始化时只指定数组长度,由系统自动分配初始值,而整数类型的默认初始值是0,所以我们只需要把第一位置为1,在直接返回该数组即可
2、官方题解
官方题解和我的思路是一样的,只是代码略有不同
int n = digits.length;
for (int i = n - 1; i >= 0; --i) {
if (digits[i] != 9) {
++digits[i];
for (int j = i + 1; j < n; ++j) {
digits[j] = 0;
}
return digits;
}
}
// digits 中所有的元素均为 9
int[] ans = new int[n + 1];
ans[0] = 1;
return ans;
3、经验分享
其实在写这篇博客之前,我的脑海里是没有完整的思路的,但是当我在博客里分析完题目之后,很快就有思路了,所以大家遇到题目,先不要着急给自己定义:好难、我想不出来等等这些标签,先冷静地分析题目,慢慢地想,可能一开始会思维不严谨、可能会遗漏情况,但是发现问题之后再改进代码也来得及,总比你不动手敲要好吧~