293、数组形式的整数加法

整数的 数组形式  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.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[] {120,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[] {215}, 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[] {215}, 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));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值