989. 数组形式的整数加法
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/add-to-array-form-of-integer/
解题思路:
该问题是一个技巧性的问题,不看官方解题思路可能很难想到这种方法,以下是对官方解题思路的复述:
官方采用逐位相加。
首先用数组 A 的最后一位,即对应整数的最低位与整数 K 相加,这样相加后的整数和的最低位就是求解和的最低位,将整数和赋值给K,所以对 K 与 10 进行求余操作得到求解和的最低位。
接下来我们不需要考虑数组 A 的最后一位,而是考虑数组 A 的倒数第二位了,我们不能直接使用上述步骤的整数和 K 直接与倒数第二位的数相加,这样相加就错位了,应该是整数和 K 的倒数第二位与数组 A 的倒数第二位相加,所以整数和 K 对 10 进行整除求得的商赋值给 K,再与数组的倒数第二位相加得到的整数和赋值给 K ,然后再与 10 取余就得到求解和的倒数第二位。重复上述步骤。
这里会出现一种可能,就是整数 K 的位数大于数组 A 的位数,所以需要对 K多余的位数进行求商赋值取余求解,直到余数为 0 退出。
代码:
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
List<Integer> list1 = new ArrayList<Integer>();
for(int i=A.length-1; i>=0; i--){
list1.add((A[i]+K)%10); // 让整数K逐位倒序相加数组A中的每个元素,取最低位作为数组的值。
K = (A[i]+K)/10; // 更新K值,去掉最低位重组K值;
}
while(K>0){
list1.add(K%10); // 若K的位数大于数组的位数,数组元素位数继续增加
K = K/10;
}
List<Integer> list2 = new ArrayList<Integer>();
for(int i=list1.size()-1; i>=0; i--){
list2.add(list1.get(i)); // list1得到的是整数和的倒序排列,需要对排序进行倒转。
}
return list2;
}
}
简化代码:
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
List<Integer> list1 = new ArrayList<Integer>();
int N = A.length;
while(--N>=0 || K>0){
if(N >= 0)
K += A[N];
list1.add(K%10); // 让整数K逐位倒序相加数组A中的每个元素,取最低位作为数组的值。
K /= 10; // 更新K值,去掉最低位重组K值;
}
List<Integer> list2 = new ArrayList<Integer>();
for(int i=list1.size()-1; i>=0; i--){
list2.add(list1.get(i)); // list1得到的是整数和的倒序排列,需要对排序进行倒转得到需要的正序解。
}
return list2;
}
}