LeetCode 66. 加一 (C语言)
一. 题目
二. 思路
输入的数组分为两种情况,第一种是+1之后数组的长度不发生改变,只需要从后往前遍历,直到遇到第一个不为9的数字+1,这个数字后面可能有n个连续的9(n可以为0),将他们全面改写为0即可。第二种是数组的所有元素都为9,+1之后数组的长度比原来多一个,此时只需要开一个长度为digitsSize+1的数组,将第一个元素赋值为1 其余均赋为0输出即可。
三.代码
int* plusOne(int* digits, int digitsSize, int* returnSize){
int flag = 1; // 先假定数组里的数全都是9
int k;
for (int i = 0; i < digitsSize; i ++ ) {
if (digits[i] != 9) {
flag = 0;
break;
}
}
if (flag == 0) { // 数组里的数不全为9,数组长度不变
*returnSize = digitsSize;
for (int i = digitsSize - 1; i >= 0; i -- ) {
if(digits[i] != 9) {
k = i;
digits[i] += 1;
break;
}
}
for (int i = k + 1; i < digitsSize; i ++ ) digits[i] = 0;
return digits;
}
if (flag == 1) {
*returnSize =digitsSize + 1;
int* arr = (int*)malloc(sizeof (int) * (digitsSize + 1));
// int arr[105]; 不能直接开数组,因为不知道传入的数字有多少个元素,需要用一次for循环 耗时
memset(arr, 0, sizeof(int) * (digitsSize + 1)); // 这里使用 menset(arr, 0, sizeof (arr)) 会报错 不知道为什么
arr[0] = 1;
return arr;
}
return;
}
执行结果