20210122 数组形式的整数加法

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

 

示例 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-to-array-form-of-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

public List<Integer> addToArrayForm(int[] A, int K) {

    }

思路1: int[]转string再转int计算  按之前刷题的经验首先想到转Integer有长度限制 

    这个思路先排除

思路2:入参K%10 分别按位取出数余 如34取到3和4 再把取到的值加到数组对应的位置上 进位+1

  (写代码时遇到了几次提交失败

     1)没考虑到最后一位有进位时没有插入

      list.add(0,jw)

     2)K长度个数若远大于int个数 得重新遍历K到list中

    if (K>0){...

   public static List<Integer> addToArrayForm1(int[] A, int K) {
       int Alen=A.length;
       int K1;//余数
        List<Integer> list =new ArrayList<Integer>(Alen);
        int jw=0;//进一位
        for (int i=0;i<Alen;i++){
            K1=K%10;
            K/=10;
            list.add((A[Alen-1-i]+K1+jw)%10);//进位后再取余 防止大于等于10的情况出现
            jw=(A[Alen-1-i]+K1+jw)>9?1:0;//下个值是否进一位
        }
//K位数大于数组时
        if (K>0){
            int klen=String.valueOf(K).length();
            for (int i=0;i<klen;i++){
                K1=K%10;
                K/=10;
                list.add((K1+jw)%10);
                jw=K1+jw>9?1:0;
            }
        }
       Collections.reverse(list);//也考虑过不用翻转 但这样做的话list得定义个初始值不太直观
       if (jw>0) list.add(0,jw);//在最后还需进位的话在list左边插入1
       return list;
    }

思路3:按思路1改进 Integer最大2147483647 长度10位 int[]转字符串后先判断长度 小于10位长度按思路1走 大于10位则切割成多个长度9位的数组 分开计算 计算也得考虑前一个数组是否进位  

这个思路的效率应该会比思路2高

原文地址:https://www.cnblogs.com/hbhb/p/14312604.html