【数据结构5】顺序表OJ题之数组形式的整形加法


题目

整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。

例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-to-array-form-of-integer
在这里插入图片描述
在这里插入图片描述

思路

1.核心步骤

1.1计算出数组的长度,创建一个新的数组来存放数据

	int ksize = 0;
    int knum = k;
    while (knum)
    {
        ksize++;
        knum /= 10;
    }
    int len = ksize > numSize ? ksize : numSize;
    int* retarr = (int*)malloc((len + 1) * sizeof(int));

1.2将数组里面的数据一个个存放到新数组中

    int newsize = 0;
    int nextnum = 0;//如果个位、十位、或者其它位大于10 则记录下进的1
    while (len--)
    {
        int a = 0;
        if ((numSize - 1) >= 0)
        {
            a = num[numSize - 1];
            numSize--;
        }
        int sum = a + k % 10 + nextnum;//计算每一位的大小
        k /= 10;
        if (sum >= 10)//每一位大于10,进1减10
        {
            nextnum = 1;//进位置成1
            sum -= 10;
        }
        else//每一位小于10进位置成0
        {
            nextnum = 0;
        }
        retarr[newsize] = sum;//向新数组中存放数据
        newsize++;
    }
    if (nextnum == 1)//当上面循环结束时如果nextnum不等于0则说明还有进位的1还没放
    {
        retarr[newsize] = 1;
        newsize++;
    }

2.循环停止的条件

当要存放的数组和k相加之后的值,全放进新数组的时候说明循环就停止了

while (len--)

3.细节方面的思考

3.1数组为什么要申请len+1个整形空间
因为数组的大小可能和k的大小一样,当循环结束时数组的最后一个数和k的最后一个数相加时可能发生进位,则nextnum=1。如果不多创建一个空间数组的将会少存一个数据。
所以要创建len+1个整形空间,否则会发生越界访问。

3.2数组是否已近正确了
我们仔细的思考之后可能会发现数组是反的与要求的结果不一样所以我们要将新数组反过来

    int left = 0;
    int right = newsize - 1;
    while (left < right)
    {
        int temp = retarr[left];
        retarr[left] = retarr[right];
        retarr[right] = temp;
        left++;
        right--;
    }

3.3nextnum是什么,有什么用
因为nextnum是计录当k的某一位和数组的其中一个相加时可能会超过10,产生进位
所以我们要把它减去10,然后记录下产生的进位也就是把nextnum置为1
当没产生进位的时候把nextnum置为0

完整版代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
    int ksize = 0;
    int knum = k;
    while (knum)
    {
        ksize++;
        knum /= 10;
    }
    int len = ksize > numSize ? ksize : numSize;
    int* retarr = (int*)malloc((len + 1) * sizeof(int));

    int newsize = 0;
    int nextnum = 0;
    while (len--)
    {
        int a = 0;
        if ((numSize - 1) >= 0)
        {
            a = num[numSize - 1];
            numSize--;
        }
        int sum = a + k % 10 + nextnum;
        k /= 10;
        if (sum >= 10)
        {
            nextnum = 1;
            sum -= 10;
        }
        else
        {
            nextnum = 0;
        }
        retarr[newsize] = sum;
        newsize++;
    }
    if (nextnum == 1)
    {
        retarr[newsize] = 1;
        newsize++;
    }
    int left = 0;
    int right = newsize - 1;
    while (left < right)
    {
        int temp = retarr[left];
        retarr[left] = retarr[right];
        retarr[right] = temp;
        left++;
        right--;
    }
    *returnSize = newsize;
    return retarr;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值