对于非负整数 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;
}
运行结果: