leetcode 989. 数组形式的整数加法——数组

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值