3612数组形式的整数加法

Posted 小雷FansUnion

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

来源:力扣(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,034);

        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[] 215806);

        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[] 215806);

        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));

    

以上是关于3612数组形式的整数加法的主要内容,如果未能解决你的问题,请参考以下文章

数组989. 数组形式的整数加法

c语言中怎么将十六进制中的高位和低位分别存到数组中

大数加法

数学问题——大整数运算

大数运算

C语言中数组高位转为低位