把一个用数组表示的整数加一(十进制进位模拟)

题目:

给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

解题思路:new一个新数组arrnew,比原数组长度+1(因为加一之后位数最多多一位,如99+1)。然后先把第一个空着,把原数组里面的数字,全部复制到arrnew[1]到arrnew[n]上,顺便最后一位+1。判断:最后一位有没有超过十;没超过就直接把原数组最后一位+1返回。否则开始处理进位:从后往前遍历,判断是否大于9,是的话取余,并且前一个+1。处理完进位后看第一个空着的有没有用到(是否为0)。如果不为0,就完成了,直接返回。如果为0,就吧arrnew的后面n位再复制回原数组返回。

 

代码:(java)

class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length;
	int[] arr = new int[n + 1];
	int i = 0;
	//把原数组复制过来,给arr留第一个位置
	for (i = 0; i < n; i++) {
		arr[i+1] = digits[i];
	}
	//第n个复制同时++
	arr[i] = ++digits[i-1];
	//如果第n个大于9,用arr数组,
	if (arr[i] > 9) {
		//处理1到length-1的进位,空的第一个留给进位
		for (int j = arr.length - 1; j > 0 ; j--) {
			if (arr[j] > 9) {
				arr[j] %= 10;
				arr[j-1] += 1;
			}
		}
		//如果第一个是0,表示没有进到这一位
		if (arr[0] == 0) {
			//全部前移一个位
			int[] x = new int[n];
			for (int j = 0; j < x.length; j++) {
				x[j] = arr[j+1];
			}
			return x;
		}
		return arr;
	}
	//如果n小于9,返回数组+1
	else {
		return digits;
	}
    }
}

 

点赞