1.题目
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
2.解题思路
首先阅读题目理解,最简单的理解就是给定的数组末尾元素加一,然后原样输出,这个可以利用循环写出。接着要考虑9这个特殊数字,因为如果结尾数字是9的话,加一就是10,然而数组的每个元素只能储存一个数字,所以这个时候数组就要扩大从而让每个元素储存一个数字。
int i;
for(i=digitsSize-1;i>=0;i--)
{ if(digits[i]<9) { digits[i]++; *returnSize=digitsSize; return digits;//判断数组末元素是否为9 } //不是9则扩大数组变0然后首位为1 digits[i]=0; }
加一之后可以给出一个新的数组,原来的元素加一变0;并且要让首位元素变1,就好比加法算术一样,变10进1,这里有碰见一个新的函数malloc,其为动态分配空间。最后同样利用循环输出新的数组。
int* new = (int*) malloc ((digitsSize + 1) * sizeof (int)); new[0] = 1; for(i = 1;i < (digitsSize + 1);i++) new[i] = 0; *returnSize = digitsSize + 1; return new;
3.代码
/** * Note: The returned array must be malloced, assume caller calls free(). */ int* plusOne(int* digits, int digitsSize, int* returnSize) { int i; for(i=digitsSize-1;i>=0;i--) { if(digits[i]<9) { digits[i]++; *returnSize=digitsSize; return digits;//判断数组末元素是否为9 } //不是9则扩大数组变0然后首位为1 digits[i]=0; } int* new = (int*) malloc ((digitsSize + 1) * sizeof (int)); new[0] = 1; for(i = 1;i < (digitsSize + 1);i++) new[i] = 0; *returnSize = digitsSize + 1; return new; }