题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
- 1 <= A.length <= 10000
- 0 <= A[i] <= 9
- 0 <= K <= 10000
- 如果 A.length > 1,那么 A[0] != 0
二、解题思路
2.1 数字相加
-
定义变量 carry 记录计算结果是否大于等于 10,即需要进位的数值
-
当数组 A 未遍历完或者数字 K 不为 0 时,循环操作
数组为倒序遍历
-
每次对数组的末位与 K 的低位进行相加操作
注意:和大于 10 时,需要进位,添加的元素为取 10 的余数
-
最终结果为 list 列表元素反转
2.2 链表
-
利用 LinkedList API 的 addFirst() 方法添加元素到链表首位
-
当数组 A 未遍历完或者数字 K 不为 0 时,循环操作
数组为倒序遍历
-
让数字 K 每次加上数组的末位
-
每次往链表首位添加元素 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);
}