整数的 数组形式 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
链接:https://leetcode-cn.com/problems/add-to-array-form-of-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package cn.fansunion.leecode.computer.plus;
import java.util.ArrayList;
import java.util.List;
/**
* 989. 数组形式的整数加法 对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。 例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。
*
* 给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
*
* 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*
* @author wen.lei@brgroup.com
*
* 2022-2-19
*/
public class AddToArrayFormOfInteger {
/*示例 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*/
/**
* 把k转换成int[]数组形式,2个int[]相加。没有越界问题
*
* @param num
* @param k
* @return
*/
public List<Integer> addToArrayForm(int[] num, int k) {
if (num == null || num.length == 0) {
List<Integer> numList = new ArrayList<>();
numList.add(k);
return numList;
}
List<Integer> numList = new ArrayList<>();
List<Integer> kNumList = intToDigitList(k);
final int lengthA = kNumList.size();
final int lengthB = num.length;
int length = Math.max(lengthA, lengthB);
int plus = 0;
// 参考AddBinary的解题思路
for (int index = 0; index < length; index++) {
int a = 0;
int b = 0;
//从低位到高位
if (index < lengthA) {
a = kNumList.get(lengthA-index-1);
}
if (index < lengthB) {
b = num[lengthB-index-1];
}
int sum = a + b + plus;
//每次放在list的最前面,低位在后,高位在前(这种细节,写代码,确实容易忘额)
numList.add(0,sum % 10);
if (sum >= 10) {
plus = 1;
} else {
plus = 0;
}
}
// 新产生1个最高位
if (plus == 1) {
numList.add(0,plus);
}
return numList;
}
/**
* 把数组转换成int整数,求和后,再转换成数组格式(代码麻烦,不推荐)
*
* @param num
* @param k
* @return
*/
public List<Integer> addToArrayFormNotGood(int[] num, int k) {
if (num == null || num.length == 0) {
List<Integer> numList = new ArrayList<>();
numList.add(k);
return numList;
}
int numInt = 0;
numInt = numArrayToInt(num, numInt);
// 可能越界了
int totalSum = numInt + k;
// 把数字totalSum再转换成list数组
List<Integer> numList = intToDigitList(totalSum);
return numList;
}
/**
* 把1个十进制的整数,转换成十进制数字组成的数组
*
* @param totalSum
* @return
*/
private List<Integer> intToDigitList(int totalSum) {
List<Integer> numList = new ArrayList<>();
while (totalSum >= 10) {
numList.add(0, totalSum % 10);
totalSum = totalSum / 10;
}
numList.add(0, totalSum);
return numList;
}
/**
* 把1个十进制的数组,转换成1个十进制的整数
*
* @param num
* @param numInt
* @return
*/
private int numArrayToInt(int[] num, int numInt) {
for (int index = num.length - 1; index >= 0; index--) {
final int curDigit = num[index];
final int time = num.length - 1 - index;
numInt += curDigit * Math.pow(10, time);
}
return numInt;
}
}
package test.leecode.computer.plus;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import cn.fansunion.leecode.computer.plus.AddToArrayFormOfInteger;
/**
* @author wen.lei@brgroup.com
*
* 2022-2-19
*/
public class AddToArrayFormOfIntegerTest {
@Test
public void testGood() {
//1,2,0,0 + 34
AddToArrayFormOfInteger add = new AddToArrayFormOfInteger();
List<Integer> list1034 = add.addToArrayForm(new int[] {1, 2, 0,0}, 34);
Assert.assertEquals((Object)1, list1034.get(0));
Assert.assertEquals((Object)2, list1034.get(1));
Assert.assertEquals((Object)3, list1034.get(2));
Assert.assertEquals((Object)4, list1034.get(3));
//
List<Integer> list1021 = add.addToArrayForm(new int[] {2, 1, 5}, 806);
Assert.assertEquals((Object)1, list1021.get(0));
Assert.assertEquals((Object)0, list1021.get(1));
Assert.assertEquals((Object)2, list1021.get(2));
Assert.assertEquals((Object)1, list1021.get(3));
}
@Test
public void testNotGood() {
AddToArrayFormOfInteger add = new AddToArrayFormOfInteger();
List<Integer> list1021 = add.addToArrayFormNotGood(new int[] {2, 1, 5}, 806);
Assert.assertEquals((Object)1, list1021.get(0));
Assert.assertEquals((Object)0, list1021.get(1));
Assert.assertEquals((Object)2, list1021.get(2));
Assert.assertEquals((Object)1, list1021.get(3));
}
}