题目链接:https://leetcode.com/problems/plus-one/
1. 题目介绍(Plus One)
You are given a large integer represented as an integer array digits, where each digits[i] is the ith digit of the integer. The digits are ordered from most significant to least significant in left-to-right order. The large integer does not contain any leading 0’s.
【Translate】:给定一个用整数数组digits
表示的大整数,其中每个digits[i]
是整数的第i位数。数字按从左到右的顺序从最重要的到最不重要的排序。large integer不包含任何前导0。
// PS: 在C语言中,LARGE_INTEGER是一个union,用于表示一个64位有符号整数,其结构定义如下:
typedef union _LARGE_INTEGER{
struct{
DWORD LowPart,
LONG HighPart
};
LONGLONG QuadPart
}LARGE_INTEGER;
//含义是当编译器支持64位整数时使用QuadPart(64位)存取。否则分别在LowPart(32位)和HighPart(32位)存取,HighPart的最高位为符号位。
//表示数的范围:--3689348814741910324到+4611686018427387903
Increment the large integer by one and return the resulting array of digits.
【Translate】: 将large integer加1并返回结果数组。
【测试用例】:
【条件约束】:
2. 题解
如上图所示,该题目的所有条件可以拆分成三点。即,① 数组最后一位一定要+1,② 满十进位问题,③ 数组扩容问题。
我们只要按照拆分的步骤一步一步的写就可以了,从最后一位起一位一位的判断是否为9,是则赋0,不是则+1后跳出;循环结束后,判断一下是否存在数组全为9的情况,判断数组第一个元素是否为0即可,为0说明即满9,进行扩容赋1操作。题解代码如下:
2.1 顺序实现
class Solution {
public int[] plusOne(int[] digits) {
int n = digits.length-1;
for(int i = n; i >= 0; i--){
if(digits[i] != 9 ){
digits[i]++;
break;
}else{
digits[i] = 0;
}
}
if(digits[0] == 0){
int[] news = new int[n+2];
news[0] = 1;
return news;
}
return digits;
}
}
2.2 递归实现
原题解来自于devarshipandya的Java Recursive Solution (Faster than 100%)。
class Solution {
public int[] plusOne(int[] digits) {
return addToGivenIndex(digits, digits.length - 1);
}
private int[] addToGivenIndex(int[] arr, int index) {
if(arr[index] != 9) {
arr[index] += 1;
return arr;
}
arr[index] = 0;
if(index == 0) {
int[] newArr = new int[arr.length + 1];
newArr[0] = 1;
for(int i = 0; i < arr.length; i++) {
newArr[i + 1] = arr[i];
}
return newArr;
}
return addToGivenIndex(arr, index - 1);
}
}