题目:
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
代码(C语言)
执行结果:0ms,击败100%的用户
代码提交框要求:
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
#include<stdio.h>
#include<stdlib.h>
int *plusOne(int* digits, int digitsSize, int* returnSize)//returnSize是一个数,何必传地址?
{
int *ret_array = NULL;//*ret_array返回的数组指针;该数组动态申请内存
int flag;//flag是进位标志
int i;
int count = 0;//用来记9的个数
//刚输出发现题目中传入的returnSize居然是0,只能自己定义一下了
for (i = 0; i < digitsSize; i++)
{
if (*(digits + i) == 9)count++;
else break;
}
if (count == digitsSize) *returnSize = digitsSize + 1;
else *returnSize = digitsSize;
ret_array = (int *)malloc(*returnSize * sizeof(int));
//复制数组
if (digitsSize == *returnSize)//如果输入输出数组长度相等,则对应位相复制
{
for (i = 0; i < digitsSize; i++)
{
*(ret_array + i) = *(digits + i);
}
}
else//如果输入输出数组长度不等,错位赋值,另第一位为1
{
*(ret_array + 0) = 0;
for (i = 0; i < digitsSize; i++)
{
*(ret_array + i + 1) = *(digits + i);
}
}
//自己实现加法的思路如下
//定义flag=1
//从最后一位开始,如果flag=1,则这一位加1
//让flag=0
//(现在)如果这一位是10,则flag=1,这一位归0
flag = 1;
for (i = *returnSize - 1; i >= 0; i--)
{
if (flag == 1)
{
*(ret_array + i) = *(ret_array + i) + 1;
}
flag = 0;
if (*(ret_array + i) == 10)
{
*(ret_array + i) = 0;
flag = 1;
}
}
return ret_array;
}
int main()
{
int i;
int digits[] = { 9,9,9,9,9,9,9,9,9 };//原数组
int *array;//用于接收函数返回的指针
int returnSize = 10;//返回数组的大小(给定)
array = plusOne(digits, 9, &returnSize);//函数调用
//输出返回的数组
for (i = 0; i < returnSize; i++)
{
printf("%d ", array[i]);
}
system("pause");
}