leetcode989--数组形式的整形加法

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

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

示例 1:

输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
示例 2:

输入:A = [2,7,4], K = 181
输出:[4,5,5]
解释:274 + 181 = 455
示例 3:

输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021
示例 4:

输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1
输出:[1,0,0,0,0,0,0,0,0,0,0]
解释:9999999999 + 1 = 10000000000

1、申请一个两者最大长度+1的空间,用于存储进位;

2、使用尾插的方式将低位与进位的值相加尾插入新的空间;

3、如果结果大于9,则存储其模值,并将进位置一;

4、最后判断是否有进位

5、逆转整个数组输出

实现代码:

 void reverse(int* str, int start, int end) {
    int temp;
    while(start < end) {
        temp = str[end];        
        str[end] = str[start];        
        str[start] = temp;        
        start++;        
        end--;    
    }
}
int* addToArrayForm(int* A, int ASize, int K, int* returnSize){
    int temp = K;
    int i = 0;
    while(temp) {
        temp /= 10;
        i++;
    }
    int len =(ASize > i) ? ASize + 1 : i + 1; 
    int* new_arr = (int*) malloc(sizeof(int)*len);
    int step = 0;
    int idx = ASize - 1;
    int j = 0;
    while(idx >= 0 || K > 0) {
        new_arr[j] = step;
        if(idx >= 0) {
            new_arr[j] += A[idx];
        }
        if(K > 0) {
            new_arr[j] += K % 10;
        }
        if(new_arr[j] > 9) {
            new_arr[j] -= 10;
            step = 1;
        }
        else {
            step = 0;
        }
        --idx;
        K /= 10;
        j++;
    } 
    if(step == 1) {
        new_arr[j++] = 1;
    }
    reverse(new_arr,0,j-1);
    *returnSize = j ;
    return new_arr; 
}

运行结果:

发布了40 篇原创文章 · 获赞 2 · 访问量 590

猜你喜欢

转载自blog.csdn.net/scacacac/article/details/105199982