题目:对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 1,2,3,1。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
整体思路可以归纳为以下三个关键步骤:
-
从低位(末尾)开始对齐相加
像列竖式一样,必须从个位开始算。对于数组 A,我们从最后一位(索引
ASize - 1)往前遍历;对于数字 K,我们通过不断取模(K % 10)来剥离出它的个位、十位、百位。把取出的这两个数字,连同进位(初始为 0)一起相加。 -
处理进位,顺次存放
每次相加后,如果结果大于 9,就意味着需要向前进一位(进位设为 1),而当前位只保留减去 10 之后的余数。计算好的数字会被按顺序依次存入一个新的结果数组
retArr中。只要数组 A 还没遍历完、数字 K 还没除尽,或者最后还留着一个进位,这个循环相加的过程就会一直继续。 -
整体翻转(修正顺序)
这是这个思路里最特别的一点:因为我们是从个位开始算,并且是从新数组的索引
0开始存的,这就导致存进去的数字顺序是倒着的 (比如正确结果是1035,数组里存的其实是[5, 3, 0, 1])。因此,最后必须通过双指针不断交换首尾元素,把整个数组翻转过来,恢复成正常的数字顺序。int* addToArrayForm(int* A, int ASize, int K, int* returnSize){ int kSize = 0; // 134 int kNum = K; while(kNum) { ++kSize; kNum /= 10; } int len = ASize > kSize ? ASize : kSize; int* retArr = (int*)malloc(sizeof(int)*(len+1)); // A [] int Ai = ASize-1; int reti = 0; int nextNum = 0; // 进位 while(len--) { int a = 0; if(Ai >= 0) { a = A[Ai]; Ai--; } int ret = a + K%10 + nextNum; K /= 10; if(ret > 9) { ret -= 10; nextNum = 1; } else { nextNum = 0; } retArr[reti] = ret; ++reti; } if(nextNum == 1) { retArr[reti] = 1; ++reti; } int left = 0, right = reti-1; while(left < right) { int tmp = retArr[left]; retArr[left] = retArr[right]; retArr[right] = tmp; ++left; --right; } *returnSize = reti; return retArr; }