0
点赞
收藏
分享

微信扫一扫

3612、数组形式的整数加法

整数的 数组形式  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));

}

}

举报

相关推荐

0 条评论