【Leetcode数据结构算法题】数组形式的整数加法(顺序表篇)

题目内容:

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

在这里插入图片描述
leetcode题目链接(点击即可跳转):


方法一:还原重组法(有坑)

1)先将数组还原成数字。例如:[1,2,0,0]还原成1200
2)再将还原的数字与X相加,得到结果。例如:1200 + 34 = 1234
3)再将结果转化为数组。例如 1234 转化为[1,2,3,4]

函数接口实现

int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    //1)将数组还原成数字
    int i = 0;
    int A = 0;
    while(i < numSize){
        A += num[i]*pow(10,numSize-i-1);
        i++;
    }
    //2)将数字相加得到结果
    int sum = A + k;
    //3)将结果转化成数组形式
    //计算sum的位数
    int tmp = sum;
    i = 1;
    while(tmp /= 10){
        i++;
    }
    *returnSize = i;
    int* arr = (int*)malloc((*returnSize) * sizeof(int));
    while(i > 0){
        arr[i-1] = sum % 10;
        sum /= 10;
        i--;
    }
    return arr;
}

测试结果:普通用例可以通过测试,但是当数组的长度较长时,超过int类型所能表示的范围时就会出错。int的取值范围为: -2^31 到 2^31-1,即-2147483648到2147483647
在这里插入图片描述
在这里插入图片描述


方法二:数组逐位相加法

既然将数组还原成数字然后相加的方法行不通,那么我们很自然能想到另外一条路“将数字转化成数组,然后数组 + 数组”。
1)将数字k转化成数组。例如34变为[3,4]
2)将数组与数组相加,要考虑数字之间的进位关系。
3)确定相加后的新数组及其长度

函数接口实现

int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    //计算k的位数
    int count = 1;
    int temp = k;
    while (temp /= 10)
    {
        count++;
    }
    //比较count和numSize大小,确定要开数组的空间
    int Asize = count > numSize ? count + 1 : numSize + 1;
    int* array = (int*)calloc(Asize, sizeof(int));
    //进行运算
    int i = 0;
    int j = Asize - 1;
    for (i = numSize - 1; i >= 0 || k > 0; )
    {
        if (i >= 0)
        {
            array[j] += num[i] + k % 10;
            if (array[j] >= 10)
            {
                array[j - 1]++;
                array[j] -= 10;
            }
            i--;
        }
        else
        {
            array[j] += k % 10;
            if (array[j] >= 10)
            {
                array[j - 1]++;
                array[j] -= 10;
            }
            i--;
        }
        k /= 10;
        j--;
    }
    if (array[0] == 0)//从前往后移位
    {
        for (i = 0; i < Asize - 1; i++)
        {
            array[i] = array[i + 1];
        }
        *returnSize = Asize - 1;
    }
    else
    {
        *returnSize = Asize;
    }
    return array;
}

在这里插入图片描述


原创不易,各位小伙伴点个赞,评论+关注呗~
(小手点赞,水逆退散,逢考必过,诸事顺利~)

  • 18
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大家好我叫张同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值