989. 数组形式的整数加法『简单』

题目来源于力扣(LeetCode

一、题目

989. 数组形式的整数加法

题目相关标签:数组

提示:

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

二、解题思路

2.1 数字相加

  1. 定义变量 carry 记录计算结果是否大于等于 10,即需要进位的数值

  2. 当数组 A 未遍历完或者数字 K 不为 0 时,循环操作

    数组为倒序遍历

  3. 每次对数组的末位与 K 的低位进行相加操作

    注意:和大于 10 时,需要进位,添加的元素为取 10 的余数

  4. 最终结果为 list 列表元素反转

2.2 链表

  1. 利用 LinkedList API 的 addFirst() 方法添加元素到链表首位

  2. 数组 A 未遍历完或者数字 K 不为 0 时,循环操作

    数组为倒序遍历

  3. 数字 K 每次加上数组的末位

  4. 每次往链表首位添加元素 K % 10,并对 K 进行除 10 操作,即舍掉最后一位

三、代码实现

3.1 数字相加

public static List<Integer> addToArrayForm(int[] A, int K) {
    List<Integer> list = new ArrayList<>();
    int carry = 0;  // 记录进位
    int len = A.length - 1;

    while (len >= 0 || K != 0) {
        int sum = 0;
        if (len >= 0) {
            sum += A[len];
            len--;
        }
        sum += K % 10 + carry;
        carry = sum / 10;
        list.add(sum % 10);
        K /= 10;
    }

    if (carry == 1) {
        list.add(carry);
    }
    Collections.reverse(list);
    return list;
}

3.2 链表

public static List<Integer> addToArrayForm(int[] A, int K) {
    LinkedList<Integer> list = new LinkedList<>();
    int len = A.length - 1;
    int lastNum = K;

    while (len >= 0 || lastNum != 0) {
        if (len >= 0) {
            lastNum += A[len--];
        }
        // 往链表首位添加元素
        list.addFirst(lastNum % 10);
        lastNum /= 10;
    }
    return list;
}

四、执行用时

4.1 数字相加

4.2 链表

五、部分测试用例

public static void main(String[] args) {
    int[] A = {1, 2, 0, 0};
    int K = 34;  // output: {1, 2, 3, 4}

//    int[] A = {2, 7, 4};
//    int K = 181;  // output: {4, 5, 5}

//    int[] A = {2, 1, 5};
//    int K = 806;  // output: {1, 0, 2, 1}

//    int[] A = {9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
//    int K = 1;  // output: {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

    List<Integer> result = addToArrayForm(A, K);
    System.out.println(result);
}
posted @ 2020-06-22 20:26  知音12138  阅读(306)  评论(0编辑  收藏  举报