LeetCode每日一练:数组形式的整数加法

LeetCode每日一练:数组形式的整数加法_第1张图片
链接: 数组形式的整数加法


思路:(C语言版本)
这道题的难点在于我们不知道两个数最高位是否还需要进位。。。。

但是我们可以确定的一个是最多只能向前进一位!为什么呢?大家想想,比如两个9相加,最高也只是18,只能向前进一位。

  1. 所以我们第一步先求出数组这个数字的长度k的长度,然后取长的那个,创建一个新数组newarr大小为长的那个数字的长度加一
  2. 第二步就是从个位开始,分别分解两个数,然后求和,并且判断是否有进制位,有的话存起来,给下一位相加时候加上去,以此循环,直到两个数都分解完成。
  3. 最后还要判断一下是否还存着一个进制位没有加上去,有的话就给newarr的最高位加一,然后将newarr反转过来(因为我们采取先尾插后反转的方式)。

代码:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    int tmp = k;
    int ksize = 0;
    while(tmp)
    {
        ksize++;
        tmp /= 10;
    }
    //求出两个长的那个
    int len = ksize > numSize ? ksize + 1 : numSize + 1;
    //然后创建一个len长度的新数组
    int* newarr = (int*)malloc(sizeof(int)*len);

    //从右往左k的每一位和数组里面的每一位相加
    int ki = 0;
    int ai = numSize - 1;
    int next = 0;//进位
    int sumi = 0;//用于赋给newarr的下标标志
    while(ki < ksize || ai >= 0)
    {
        //分解出num的每一位
        int aval = 0;
        if(ai >= 0)
        {
            aval = num[ai];
        }

        //分解出k的每一位
        int kval = 0;
        if(ki < ksize)
        {
            kval = k % 10;
            k /= 10;
        }

        int sum = kval + aval + next;
        //判断一下是否需要进位
        if(sum > 9)
        {
            sum -= 10;
            next = 1;
        }
        else 
        {
            next = 0;
        }

        //将sumi的数值赋给新数组newarr
        newarr[sumi++] = sum;

        ai--;
        ki++;
    }

    //判断是否还有进位
    if(next == 1)
        newarr[sumi++] = 1;

    //最后逆置新数组newarr
    int begin = 0;
    int end = sumi - 1;
    while(begin < end)
    {
        int tmp = newarr[begin];
        newarr[begin] = newarr[end];
        newarr[end] = tmp;
        ++begin;
        --end;
    }

    //将长度以及数组返回
    *returnSize = sumi;
    return newarr;
}

LeetCode每日一练:数组形式的整数加法_第2张图片

你可能感兴趣的:(刷题册,leetcode,算法,数据结构)