先看题目描述:
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
示例 1:
输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
int num=0; //存放运算结果
int len=A.length; //获取数组长度
int value;
int a; //存储中间量
for(int i=0;i<A.length;i++){
len=len-1; //循环一次,长度减一
a=(int) Math.pow(10,len); //计算10的len次幂,存放在a中
value=(A[i]*a); //获取A数组中i下标的值
num=num+value; //将数组转化为数值
}
num=num+K; //进行计算
String s=num+""; //转化为String类型的值
List list = new ArrayList();
int c;
for(int i=0;i<s.length();i++){
char b = s.charAt(i); //取出i下标的数字转化为char类型
c = b - '0'; //将char转化为int
list.add(c); //添加到集合中
}
return list;
}
}
注意:此方法看似很美好(当初我也是这么想的),但在测试时系统会无限制加大输入数组值,在我将类型转化为long时系统接着会让数组的值突破天际,直到溢出。。。。。。看来他们不喜欢这种方法。。。
来看一个通用的解决方案:
class Solution {
public static List<Integer> addToArrayForm(int[] A, int K) {
int carry = K;
for(int i=A.length-1;i>=0;i--){
int tmp = A[i] + carry; //从后往前取出对应位数值做加法运算
carry = tmp/10; //设置溢出位
A[i] = tmp%10; //将加法运算结果对应位存回数组
}
List<Integer> results = new ArrayList<>();
while(carry>0){ //若运算完毕后carry位数大于A的位数
results.add(0,carry%10); //取每一位的余数加在list的首位
carry = carry/10;
}
for(int a:A){
results.add(a); //将数组存入list
}
return results;
}
}
此方法相当于一直在数组中做运算,避免了数值过大的溢出问题。