力扣 989. 数组形式的整数加法

题目说明

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

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

示例

例1

1
2
3
输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

例2

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

例3

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

例4

1
2
3
输入: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

笔者理解

此题是一道数组求解算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,一开始想着直接算出A数组对应的numA然后和K相加直接给与结果集,结果发现这样的数直接算出来会整数越界,后来发现只要将A数组和K对应位次相加,然后记录上一位是否有进位即可,就让我们看看具体如何实现吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public static List<Integer> addToArrayForm(int[] A, int K) {
List<Integer> result = new ArrayList<>();
//定义结果集
int size = A.length - 1;
//从0结束,所以是A.length - 1
int sum = 0;
//当前位次的和
int tick = 0;
//标记是否有进位
while (size >= 0 || K != 0) {
// 循环条件:两个数其中有一个没运算完
int x = size >= 0 ? A[i]: 0;
int y = K != 0 ? K % 10 : 0;

sum = x + y + tick;
tick = sum / 10;
//如果当前加出来的和大于等于10,tick记为进位

K = K / 10;
//K位次移动
size--;
//A数组下标移动
result.add(sum % 10);
}
if (tick != 0) result.add(tick);
//考虑最后刚好多进一位的可能
Collections.reverse(result);
//翻转数组,变为正序
return result;
}

时间和空间效率都较高,可见此解法比较适合此题;

image.png

总结

本题是今天的每日一题,难度只有简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。