数组+整数

算法

Posted by CH on May 19, 2020

题目

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。

例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

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

题干

数组 + 整数

思路

一定不要想着将数组化为整数相机 因为数组的位数是不限的 临时变量即使是long也无法存储 而且要考虑两边长度不齐的问题 可以先遍历一边 等遍历完 将另一边的剩余位数补齐

位数相加

让数组的个位和整数的个位相加 进位将1 加到剩余的整数中

只加个位

将整数直接加到个位的地方 通过进位的形式 加到数组前面

解答

位数相加

public class Solution {
  public static List<Integer> addToArrayForm(int[] num, int k) {
        List<Integer> results = new ArrayList<>();
        //按位相加
        for(int i=num.length-1;i>=0;i--){
            int add = num[i]+k%10;
            k=k/10;
            if(add>=10){
                k++; //如果发生进位 就把进位的1 放到后续的数 91/10 = 9 如果有进位 9+1 =10
                add-=10;
            }
            results.add(add);
        }
        //数组遍历完 k还有值
        for(; k > 0; k /= 10){
            results.add(k % 10);
        }
        Collections.reverse(results);
        System.out.println("");
        printList(results);
        return results;
    }
}

只加个位

class Solution {
   public List<Integer> addToArrayForm(int[] num, int k) {
        List<Integer> res = new ArrayList<Integer>();
        int n = num.length;
        for (int i = n - 1; i >= 0 || k > 0; --i, k /= 10) { //循环到n结束或者K位数整除完
            if (i >= 0) {
                k += num[i];
            }
            res.add(k % 10);
        }
        Collections.reverse(res);
        return res;
    }
}

时空复杂度分析

如果采用位数相加解法 时间复杂度为O(n+logK) 空间复杂度为O(1) 除了返回值使用到的为常数

如果采用只加个位解法 时间复杂度为O(Max(n,logK) 空间复杂度为O(1) 虽然是一个量级 个位解法更快

解题技巧 总结形成套路

当前位 = (A 的当前位 + B 的当前位 + 进位carry) % 10

注意,AB两数都加完后,最后判断一下进位 carry, 进位不为 0 的话加在前面。

while ( A 没完 || B 没完)
    A 的当前位
    B 的当前位

     = A 的当前位 + B 的当前位 + 进位carry

    当前位 =  % 10;
    进位 =  / 10;
    

判断还有进位吗 

结语

此题涉及到数的位数 /10 和%10 分别有什么作用 进位如何实现 一定要清楚 还要考虑边界补位