• LeetCode> 989. 数组形式的整数加法


    题目

    对于非负整数 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
    

    示例 2:

    输入:A = [2,7,4], K = 181
    输出:[4,5,5]
    解释:274 + 181 = 455
    

    示例 3:

    输入:A = [2,1,5], K = 806
    输出:[1,0,2,1]
    解释:215 + 806 = 1021
    

    示例 4:

    输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1
    输出:[1,0,0,0,0,0,0,0,0,0,0]
    解释:9999999999 + 1 = 10000000000
    

    提示:

    1 <= A.length <= 10000
    0 <= A[i] <= 9
    0 <= K <= 10000
    如果 A.length > 1,那么 A[0] != 0
    

    解题思路

    首先排除将数组A转化为int或者long形式,因为A.lenth <= 10000,也就是说A所代表的整型数字最大位数可能有10000个,远超int/long int 所能表示范围。
    考虑将K转化为数组形式,然后A+K就成了2个数组按位加(需进位)的问题。

    这里可能会存在2个问题:
    1.不确定A、K长度;
    2.高位溢出;

    因为最终和值长度不确定,可以用链表存储按位相加的和值(顺序表只适合在尾部插入数据),并且每次都将插到头部,这样生成的和值列表按序号递增,存储位的位权递减。

    实现代码

    从个位到高位,分别对2个整数进行遍历求和(注意进位)。

    /**
     * 从个位到最高位分别对数组A和k进行遍历, 求每一位上的和、进位, 一直到最后最高位相加并且处理完进位
     * @param A 表示加数, 非负整数的数组A, A[0..length-1] 表示高位到低位
     * @param K 表示被加数
     * @return A[]和K对应整数相加后的和值(以列表形式存储)
     */
    public List<Integer> addToArrayForm(int[] A, int K) {
        if (A.length == 0) return null;
        if (K < 0) K = -K;
    
        int carry = 0;
        List<Integer> list = new LinkedList<>();
    
        for (int i = A.length-1; i >= 0 || K > 0 || carry > 0; i--, K/=10) {
            int d = K > 0? K % 10: 0;
            int n = i >= 0? A[i]: 0;
    
            int sum = n + d + carry;
            carry = 0;
    
            if (sum > 9) {
                sum -= 10;
                carry ++;
            }
    
            list.add(0, sum);
        }
    
        return list;
    }
    
    

    改进

    对参与加法的加数进行遍历的时候,考虑到的条件是一个或语句,包含了3个部分,能否简化一下,将它们合并到一起,以减少条件判断?
    答案是可以的, 因为最终存储的实际上是 ( K+A[i] ) % 10 (K+A[i]个位数),是否进位也是看(K + A[i]) 的十位数是否有变化。不过,当前的十位数,也是下一次循环时的个位数。

    for (int i = A.length-1; i >= 0 || K > 0 || carry > 0; i--, K/=10)
    
    public List<Integer> addToArrayForm(int[] A, int K) {
        if (A.length == 0 || K < 0) return null;
    
        LinkedList<Integer> list = new LinkedList<>();
    
        for (int i = A.length-1; i >=0 || K > 0; i--, K /= 10) {
            if (i >= 0) {
                K += A[i];
            }
    
            list.addFirst(K % 10);
        }
        return list;
    }
    

    参考

    LeetCode 989. 数组形式的整数加法

  • 相关阅读:
    SRM146 DIV1 600
    SRM145 DIV1 1000
    SRM146 DIV1 300
    SRM145 DIV1 600
    【HTML打卡】0115 margin重叠、内联元素、css控制段落
    【HTML打卡】0114 盒模型margin、border、padding
    【HTML打卡】0113 div布局,css控制
    【HTML打卡】0112-html发展、doctype声明
    Machine Learning结课感想
    【ACM打卡】ZOJ 1045 2722 2830
  • 原文地址:https://www.cnblogs.com/fortunely/p/13264182.html
Copyright © 2020-2023  润新知