题目:
给定一个十进制数,用数组表示每一位,要求返回加一后的结果
思路:
从数组尾部到头部处理,用一个overflow flag来判断是否溢出,如果溢出则需要新开一个array
注意:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
import java.util.Arrays;
/**
* Plus One
*
* Given a number represented as an array of digits, plus one to the number.
*/
public class S66 {
public static void main(String[] args) {
int[] digits = {9,9,9};
// int[] digits = {0};
System.out.println(Arrays.toString(plusOne(digits)));
}
public static int[] plusOne(int[] digits) {
int i = digits.length-1;
int overflow = 0; // 用来表示是否overflow了
// 从尾到头加
while(i >= 0){
if(digits[i]+1 > 9){ // 加完大于9的情况
digits[i] = 0;
overflow = 1;
i--;
}else{ // 加完小于10的情况
digits[i] = digits[i]+1;
return digits;
}
}
// 这种情况是当前位数不够用,就必须新开数组,
// 处理首位
if(overflow > 0){
int[] newDigits = new int[digits.length+1];
System.arraycopy(digits, 0, newDigits, 1, digits.length);
newDigits[0] = 1;
newDigits[1] = 0;
return newDigits;
}
return digits;
}
}
public class Solution {
public int[] plusOne(int[] digits) {
int[] ret = new int[digits.length];
int i = digits.length-1;
int c = 0; // carry
while(i >= 0){
int val = digits[i];
if(i==digits.length-1){ // rightmost
val += c + 1;
}else if(c > 0){ // carry
val += c;
}
if(val > 9){
ret[i] = 0;
c = 1;
}else{
ret[i] = val;
c = 0;
}
i--;
}
if(c == 1){
int[] copy = new int[digits.length+1];
System.arraycopy(copy, 1, ret, 0, ret.length);
copy[0] = 1;
return copy;
}else{
return ret;
}
}
}