题目
链接: 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;
} else
digits[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 // 需要进一,就得把进一前的那一位变成0
digits[i] = 0;
}
// 元素全为9,例如999这种情况时
int* ans = malloc(sizeof(int) * (digitsSize + 1));
// 开辟一块比原来数组多一位的内存,将里面的元素全部变成0
memset(ans, 0, sizeof(int) * (digitsSize + 1));
// 只需将首元素变成1就行了
ans[0] = 1;
*returnSize = digitsSize + 1;
return ans;
}
本文含有隐藏内容,请 开通VIP 后查看