给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
总结:即在一个数组中实现加一的操作,是将数组的数字按照整数的方式进行列出,再实现加一,然后再将这个整数放回数组中
图解如下:
OK啊当然这里可能还存在进位的情况,即当999,99,9这样的数据加一时会发生进位的操作;
如下图所示:
这里我们就在原数组进行操作,即数组的最后一位进行加一的操作,这里就有两种情况;
第一种情况:当最后一位数不为9,那么就直接进行加一操作,直接返回即可
第二种情况:当最后一位为9,那么就要进行进位,然后再次判断前一位的师数值是否满足加一进位的需求,每次操作进行循环判断前一个数,若是9,99,999这种特殊的数,那么就要进行数组的扩容操作,扩容的数值加一;
这里就直接通过判断数组的长度实现数组每个数字进行乘以对应的进制数,转化为整数后,直接加一,然后再将这个整数转化为数组;
代码如下:
class Solution {
public int[] plusOne(int[] digits) {
for(int i=digits.length-1;i>=0;i--){
digits[i]++;
digits[i]=digits[i]%10;
if(digits[i]!=0){
return digits;
}
}
digits=new int[digits.length+1];
digits[0]=1;
return digits;
}
}
解释:
1.循环从最后一个数进行往前的操作判断,直接对数组的最后一个数值进行加一的操作,然后判断这个数值加一是否发生了进位,没有就直接返回,发生了那么就前一位再次加一;
2.到达一个数不为9时进行加一的操作后,不会发生进位的操作,那么就直接跳出循环
3.但是这里注意,若为999,这种全为9的数字组成的值,那么跳出循化就是这种数值,假如是999,跳出循环后为000,然后进行扩容数组下标为0的值就改为1即可;
第一步:数组转化为整数
代码如下:
public long Func(int[] arr) {
int length = arr.length;
long num = 1;
long sum = 0;
while (length > 1) {
num *= 10;
length--;
}
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i] * num;
num /= 10;
}
// 循环结束后数值就有了
return sum;
}
解释:
首先这里小编实现了数组转化为整数的方法,通过长度实现最高位的位数,然后通过for循环实现从最高位,到最低位的数字相加就是;例如:123就是:100*1+10*2+1*3;最后返回就行;
第二步:实现整数转化为数组
代码如下:
public int[] Func1(long num) {
// 进行整数转化为数组
int count = 0;
long oldnum = num;
while (num > 0) {
num /= 10;
count++;
}
// 知道这里的新的数组的长度就是入下
int[] newArr = new int[count];
for (int i = newArr.length-1; i>=0; i--) {
newArr[i] = oldnum % 10;
oldnum /= 10;
}
return newArr;
}
解释:
和上面一样,判断整数的位数,然后进行数组的初始化,最后通过循环,取模拿到对应位置的数字,每次拿到数字后,都要进行除以10的操作,为下一次取模进行准备;最后返回数组即可;
通过以上代码进行操作的时候,第二种方法实现的过程中存在一定的问题,咱们带入力扣进行观察,如下所示:
注意:
此时进行提交时发生错误,但是测试通过了,这就是精度导致的问题,若我们将这里的int类型的变量改为long类型,但是提交就会冒出更长的数组,就会导致导处来的整数太大发生错误;
💬💬上述的两种方法的实现中,第一种方法适用于全部的场景,但是这里的第二种方法会存在输入的数组的长度太长就会导致存在精度的问题发生,所以这里的第二种方法只适用于数组长度不是很长的情况;
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!