需求:
给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组。
该数字按照大小进行排列,最大的数在列表的最前面。
样例:
给定 [1,2,3]
表示 123, 返回 [1,2,4]
.
给定 [9,9,9]
表示 999, 返回 [1,0,0,0]
.
分析:
思路一
使用字符串和数组以及基本数据类型之间的转换关系进行求解。
1)遍历数组,求解其数值,注意应该定义long型变量,以防越界,将该值加一
2)将long型数值转成字符串,并转成字符数组
3)遍历字符数组,转成整型数组
思路二
使用加法进位的原理进行求解。
1)对于数值均为9的数组,应该创建新的数组,新数组长度比原始数组长度多1,并且第一个元素是1,其余值为0
2)倒序遍历数组,每一个数位的值应为其原始值和上一位进位值的和%10,每一位的进位是其原始值和上一位进位值的和/10
3)由于是加一,所以可以设置初始进位值为1
代码:
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
/*
//思路一:使用字符串和数组以及基本数据类型之间的转换
//遍历数组,求其数值
long num = 0;
for(int i = digits.length-1; i >= 0; i--)
{
num += digits[i]*Math.pow(10, digits.length-1-i);
}
num += 1;
//数值转成字符串
String str = num+"";
//将字符串转成字符数组
char[] ch = str.toCharArray();
//将字符数组转成整型数组
int[] arr = new int[ch.length];
for(int i = 0; i < arr.length; i++)
{
arr[i] = Integer.parseInt(ch[i]+"");
}
return arr;
*/
//思路二:使用加法进位原理进行求解
//如果都是9,那么就创建新的数组,长度是digits.length+1
//第一位是1,其余是0
int len = 0;
for(; len < digits.length; len++)
{
if(digits[len] != 9)
{
break;
}
}
//如果结束for循环是因为所有的数值为9
if(len == digits.length)
{
int[] arr = new int[digits.length+1];
arr[0] = 1;
for(int i = 1; i < arr.length; i++)
{
arr[i] = 0;
}
return arr;
}
//如果结束for循环是因为break,那么对原始数组进行修改
//由于是加一,所以可以将初始进位设为1
int carry = 1;
for(int i = digits.length-1; i >= 0; i--)
{
carry += digits[i];
digits[i] = carry % 10;
carry /= 10;
}
return digits;
}
}