题目:给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
分析:函数有三个参数,分别用来传数组,传数组长度以及返回数组的长度(returnSize的类型为int*是因为传址才能在函数中改变该变量的值)函数返回类型为int*,题目要求返回malloc开辟的数组。
1.将原数组储存到新开辟的数组tmp。由于可能存在数组最高位进位,位数增加的情况,所以在创建数组时提前扩大一个int型,并且将数组后移一位,让tmp[0]作为最高位,并将其置为0。
2.数组加一分为进位和不进位两种情况,需要判断。因为是给该数字加一,所以进位一定是从最低位开始,所以逆序遍历数组。令tmp[i]=(tmp[i]+1)%10 若未进位,(tmp[i]+1)%10仍为本身,若进位,tmp[i]则为零。若tmp[i]不为0,说明不进位,则结束循环;若为0,则继续遍历高一位。
3.通过tmp[0]的值来判断最高位是否发生进位,若仍为0,则未发生进位,数字长度未变,将数组前移一位,return;若为1,则发生进位,将returnSize+1,return。
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
int i = 0;
*returnSize=digitsSize;
//1.创建比原来数组大四个字节的空间,防止进位
int* tmp = (int*)malloc(sizeof(int) * (digitsSize + 1));
//2.将原数组中数据依次存入tmp中,但tmp[0]值为零,从tmp[1]开始存入
for ( i = 0; i < digitsSize; i++)
{
tmp[i + 1] = digits[i];
}
tmp[0] = 0;
//3.逆序遍历数组,判断是否进位
for (i = digitsSize; i >= 0; i--)
{
tmp[i] = (tmp[i] + 1) % 10;
if (tmp[i] == 0)
continue;
else
break;
}
//4.若tmp[0]仍未0,说明最高位没有进位,将此时的数组往前挪一位;若tmp[0]为1,说明已经进位,直接返回
if (tmp[0] == 1)
{
(*returnSize)++;
return tmp;
}
else
{
for (i = 0; i < digitsSize; i++)
{
tmp[i] = tmp[i + 1];
}
return tmp;
}
}