【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;
}

在这里插入图片描述


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

猜你喜欢

转载自blog.csdn.net/QIYICat/article/details/122271278
今日推荐