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