数组形式的整数加法
整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。
例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。
示例 1:
输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
示例 2:
输入:num = [2,7,4], k = 181
输出:[4,5,5]
解释:274 + 181 = 455
示例 3:
输入:num = [2,1,5], k = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021
提示:
1 <= num.length <= 104
0 <= num[i] <= 9
num 不包含任何前导零,除了零本身
1 <= k <= 104
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-to-array-form-of-integer
题解一:
笔者的题解,用的是逐位相加,官解也用了这种方法,但官解写的代码比笔者的简单多了,主要因为笔者把相加的进位进在了数组中,应该把相加的进位加在k上,这样会简单很多。不管怎样,还是记录一下自己笨拙的代码吧。
class Solution {
public List<Integer> addToArrayForm(int[] num, int k) {
List<Integer> list=new ArrayList<Integer>();
int len=0;
int x=k;
while(x>0){
x/=10;
len++;
}
//定义一个数组存放相加之后的数
int[] arr=new int[Math.max(num.length,len)+1];
int i=num.length-1,j=arr.length-1;
for(;i>0&&k>0;i--,j--){
int a=num[i]+(k%10);
if(a>9){
a%=10;
num[i-1]++;
}
arr[j]=a;
k/=10;
}
if(k==0){
while(i>=0){
if(i==0&&num[i]>9){
arr[j]=num[i]%10;
arr[j-1]=1;
i--;
j--;
}else if(num[i]>9){
arr[j]=num[i]%10;
num[i-1]++;
i--;
j--;
}else{
arr[j]=num[i];
i--;
j--;
}
}
}else{
num[0]+=k%10;
k/=10;
if(num[0]>9){
arr[j]=num[0]%10;
arr[j-1]=1;
j--;
}else{
arr[j]=num[0];
j--;
}
while(k!=0){
arr[j]+=k%10;
if(arr[j]>9){
arr[j]%=10;
arr[j-1]=1;
}
j--;
k/=10;
}
}
if(arr[0]!=0){
list.add(arr[0]);
}
for(int s=1;s<arr.length;s++){
list.add(arr[s]);
}
return list;
}
}
题解二:
官解用的也是逐位相加,但是代码明显简介易懂多了,直接来看代码吧:
class Solution {
public List<Integer> addToArrayForm(int[] num, int k) {
List<Integer> res = new ArrayList<Integer>();
int n = num.length;
for (int i = n - 1; i >= 0; --i) {
int sum = num[i] + k % 10;
k /= 10;
if (sum >= 10) {
k++;//把进位加在了k上
sum -= 10;
}
res.add(sum);//先倒序放在集合中,最后再翻转一下
}
for (; k > 0; k /= 10) {
res.add(k % 10);
}
Collections.reverse(res);
return res;
}
}