package sim;
import java.math.BigDecimal;
import java.util.Arrays;
public class Add1 {
/*给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]*/
public static void main(String[] args) {
int[] nums= {9,8,7,6,5,4,3,2,1,0};
int[] nums1=plusOne1(nums);
System.out.println(Arrays.toString(nums1));
}
public static int[] plusOne1(int[] digits) {//[9,8,7,6,5,4,3,2,1,0]
//将该数组所有元素变成一个整数
String str="";
for(int i=0;i<digits.length;i++) {
str+=digits[i];
}//str=123
BigDecimal nums=new BigDecimal(str);
BigDecimal one=new BigDecimal(1);
nums=nums.add(one);//加1 ---->9876543211
String arr=String.valueOf(nums);//987654321
//算出应除的位数
BigDecimal yz=new BigDecimal(10);
for(int j=0;j<arr.length()-1;j++) {
one=one.multiply(yz);//1000000000
}
//求每一位挨个往数组中存放
int[] res=new int[str.length()];
for(int i=0;i<digits.length;i++) {
//BigDecimal的divideAndRemainder方法求余,返回的是一个数组(商,余数)
BigDecimal[] b=nums.divideAndRemainder(one);//dig[0]=1,
res[i]=b[0].intValue();//商即为每位数字
nums=b[1];//余数作为接下来的商
one=one.divide(yz);//除数改变(少一位即除10)
}
return res;
}
}
这里将字符串转成int类型时,不要直接用int接收,因为可能会存在超出int范围(-2147483648~2147483647),可以采用BigDecimal来接收,就不会报“Exception in thread "main" java.lang.NumberFormatException: For input string: "98765432101"
at java.lang.NumberFormatException.forInputString(Unknown Source)”这个错误了。
以上是我的解题思路,还有别的其他思路,欢迎诸君共同探讨。