LeetCode Notes_#989 Add To Array-Form Integer(Java)
Contents
思路1:数组转换为数字再相加
先把输入的A数组转换为数字,然后加上K,取出结果中的每一位,组成一个List.代码如下:
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
int num = 0;//最终应该是X+K这个数字
ArrayList res = new ArrayList();
System.out.print("A.length-1 = "+(A.length-1)+'
');
for(int i = A.length-1;i >= 0;i--){ //遍历数组A,转化为int型
num += A[i]*Math.pow(10,A.length-1-i);
System.out.print("num = "+num+'
');
}
num += K;
int digit = num%10;//代表遍历到的最新的一位数,如果是0,说明已经结束
while(num != 0){
digit = num%10;
res.add(0,digit);//把最新的一位加到最前面
num = num/10;
}
return res;
}
public static void main(String[] args){
int[] A = new int[]{1,2,0,0};
Solution solution = new Solution();
List<Integer> B = solution.addToArrayForm(A,34);
for(int i = 0;i<=B.size()-1;i++){
System.out.print(B.get(i));
}
}
}
遇到的问题
- 发现对于大数会溢出,所以这种方法是不可行,无法通过的。
- 但是我看这位学长的题解里边使用python这么写好像没问题?
- https://blog.csdn.net/fuxuemingzhu/article/details/87861602
- 查了一下,python对于整数是没有位数限制的,也就是说理论上可以计算任意大的数字,所以不存在溢出的情况。
- 而在java中想要解决这个问题,就需要使用BigInteger这个类,这个部分这位学长也有写总结,佩服佩服!
- https://blog.csdn.net/fuxuemingzhu/article/details/60594372
- 用BigInteger写的程序,转换起来很麻烦...还没调通
思路2:按照每一位的顺序相加
代码如下
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
int N = A.length;
int cur = K;
ArrayList<Integer> res = new ArrayList();
int i = N;
while(--i >= 0 || cur > 0){//意思是说只有cur==0&&i==0的时候才会停止,注意--放在前后是不一样的,放在后面的话,会多出一轮循环
if(i >= 0)
cur += A[i];
res.add(cur%10);
cur /= 10;
}
Collections.reverse(res);
return res;
}
}
思路
- K是一个数,A是一个数组,那么每次我从A中取出最后一个数与K相加,拿出最后一位,放入结果数组中;
- 下一次抛弃掉K的最后一位,从A取出倒数第二个与K相加,拿出最后一位,放入结果数组;
- ...依次类推,直到cur==0 且 i ==0的时候,循环结束,i == 0说明已经遍历到了A的第一个数字,cur == 0说明没有进位了,再运行一轮只会在前面加一个0。
- 最后,将数组的元素反转,因为之前是倒着加的。如果不知道这个方法的话,就需要自己写一下。