原文链接: https://leetcode-cn.com/problems/add-to-array-form-of-integer
英文原文
The array-form of an integer num
is an array representing its digits in left to right order.
- For example, for
num = 1321
, the array form is[1,3,2,1]
.
Given num
, the array-form of an integer, and an integer k
, return the array-form of the integer num + k
.
Example 1:
Input: num = [1,2,0,0], k = 34 Output: [1,2,3,4] Explanation: 1200 + 34 = 1234
Example 2:
Input: num = [2,7,4], k = 181 Output: [4,5,5] Explanation: 274 + 181 = 455
Example 3:
Input: num = [2,1,5], k = 806 Output: [1,0,2,1] Explanation: 215 + 806 = 1021
Example 4:
Input: num = [9,9,9,9,9,9,9,9,9,9], k = 1 Output: [1,0,0,0,0,0,0,0,0,0,0] Explanation: 9999999999 + 1 = 10000000000
Constraints:
1 <= num.length <= 104
0 <= num[i] <= 9
num
does not contain any leading zeros except for the zero itself.1 <= k <= 104
中文题目
对于非负整数 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
通过代码
高赞题解
这道题和2. 两数相加一样,换汤不换药。
只要记住这个公式,不管两个数是列表形式,还是数组形式,都不会写错!
<**公式**>
当前位 = (A 的当前位 + B 的当前位 + 进位carry) % 10
注意,AB两数都加完后,最后判断一下进位 carry, 进位不为 0 的话加在前面。
<**加法模板**>
while ( A 没完 || B 没完)
A 的当前位
B 的当前位
和 = A 的当前位 + B 的当前位 + 进位carry
当前位 = 和 % 10;
进位 = 和 / 10;
判断还有进位吗
class Solution {
public List<Integer> addToArrayForm(int[] A, int K) {
int n = A.length;
List<Integer> res = new ArrayList<>(); // 可以用 LinkeList,或者 ArrayList 往后加,最后反转
int i = n - 1, sum = 0, carry = 0;
while (i >= 0 || K != 0) { // 循环条件:两个数有一个没完
int x = i >= 0 ? A[i]: 0;
int y = K != 0 ? K % 10 : 0;
sum = x + y + carry;
carry = sum / 10;
K = K / 10;
i--;
res.add(0, sum % 10);
}
if (carry != 0) res.add(0, carry);
return res;
}
}
这个模板真的可以解很多题。比如 165. 比较版本号
// 细节: split的时候,【.】在JAVA正则表达式里有特殊含义,表示"任意字符",需要进行转义
class Solution {
public int compareVersion(String version1, String version2) {
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int m = v1.length, n = v2.length;
int i = 0;
while (i < m || i < n) {
int a = i < m ? Integer.valueOf(v1[i]) : 0;
int b = i < n ? Integer.valueOf(v2[i]) : 0;
if (a == b) {
i++;
continue;
}
return Integer.compare(a, b);
}
return 0;
}
}
还可以推广到字符串比较。比如这道谷歌高频题:809. 情感丰富的文字
<**比较模板**>
while( A 没完 && B 没完)
A 的当前字符
B 的当前字符
A 的当前字符长度
B 的当前字符长度
判读符合比较条件吗
判断 A B 都走完了吗
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
54187 | 115240 | 47.0% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|
相似题目
题目 | 难度 |
---|---|
两数相加 | 中等 |
加一 | 简单 |
二进制求和 | 简单 |
字符串相加 | 简单 |