给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。
该数字按照数位高低进行排列,最高位的数在列表的最前面。
样例
给定 [1,2,3]
表示 123, 返回 [1,2,4]
.
给定 [9,9,9]
表示 999, 返回 [1,0,0,0]
.
解题思路:
一开始想到将数组元素转化为数字再加一,最后转换到数组,实现太复杂,而且时间与空间复杂度过高。
后来就是手动在数组中实现加法,设置进位标识符cnt,从尾至头遍历依次按位计算,最后要考虑9,99,999这类情况,如果加完后首位为0且cnt不为0表示需要再向前进一位,在首位之前插入cnt即可。
public class Solution {
/**
* @param digits: a number represented as an array of digits
* @return: the result
*/
public int[] plusOne(int[] digits) {
// write your code here
int p = digits.length - 1;
int cnt = 1;
while(p >= 0){
int temp = digits[p] + cnt;
cnt = temp/10;
digits[p] = temp%10;
p--;
}
if(cnt == 0){
return digits;
}else{
int[] res = new int[digits.length+1];
res[0] = cnt;
return res;
}
}
}
二刷:
public class Solution {
/**
* @param digits: a number represented as an array of digits
* @return: the result
*/
public int[] plusOne(int[] digits) {
// write your code here
List<Integer> list = new ArrayList<>();
int cnt = 1;
for(int i=digits.length-1; i>=0; i--){
list.add((digits[i]+cnt)%10);
cnt = (digits[i]+cnt)/10;
}
if(cnt != 0)
list.add(cnt);
int[] res = new int[list.size()];
for(int i=list.size()-1; i>=0; i--)
res[list.size()-i-1] = list.get(i);
return res;
}
}