文章目录
- 题目
- 思路
- 代码呈现
题目
链接: link
思路
题目的意思是把一个数以数组的形式输入,然后在这个书的末尾加一,应该是要考察,如果数加一后位数发生变化,比如999+1成1000,3位数变成4位数怎么处理的。
并且我们可以发现这种需要进一位的做法仅存在所有元素都为9的时候。
首先 我们可以先不考虑上面那种情况,假设不进位
所以一判断它不大于10,就直接输出出去。
digits[i] += 1;
if (digits[i] != 10) {*returnSize = digitsSize;return digits;
然后 再考虑可能会进一,但不会进位的情况
那就是需要把整个数组从最低位循环一遍,遇到10的进一,并且让10变成0,然后和大于10的放一起,方便离开函数
for (int i = digitsSize - 1; i >= 0; i--) {digits[i] += 1;if (digits[i] != 10) {*returnSize = digitsSize;return digits;} elsedigits[i] = 0;}
最后 就是元素全为9的情况,这种情况较特殊,需要进位,但是好处是,他的第一位绝对是1,后面也绝对是0,于是我们可以直接开辟一块 sizeof(int)*(digitsSize+1) 大小的新的内存,将里面的所有元素都变成0,然后让首元素变成1就行了
// 元素全为9,例如999这种情况时int* ans = malloc(sizeof(int) * (digitsSize + 1));memset(ans, 0, sizeof(int) * (digitsSize + 1));ans[0] = 1;*returnSize = digitsSize + 1;return ans;
}
代码呈现
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {for (int i = digitsSize - 1; i >= 0; i--) {digits[i] += 1;if (digits[i] != 10) { // 如果不需要进1,直接返回*returnSize = digitsSize;return digits;} else // 需要进一,就得把进一前的那一位变成0digits[i] = 0;}// 元素全为9,例如999这种情况时int* ans = malloc(sizeof(int) * (digitsSize + 1));// 开辟一块比原来数组多一位的内存,将里面的元素全部变成0memset(ans, 0, sizeof(int) * (digitsSize + 1));// 只需将首元素变成1就行了ans[0] = 1;*returnSize = digitsSize + 1;return ans;
}