题目分析
题目用一个非空数组去表示一个整形数字,对这个数字加一处理后,依然用非空数组去表示。
Input: [2,2,9,9]
Output: [2,3,0,0]
如果把这个问题看作处理数组,主要考虑模拟十进制进位的问题,若其中最后一个元素加1大于9,则该位置0,前一位加1,再次判断加1后是否大于9,重复上面步骤。
如果把这个问题单纯看作十进制数加1,可以先遍历数组写成十进制数,加1的结果再次写成数组即可。但是这个方法需要两次遍历数组,其时间复杂度显然太大了。
编程实现
C实现
int* plusOne(int* digits, int digitsSize, int* returnSize) {
if (digits == NULL)
{
return NULL;
}
int n = digitsSize-1;
while(n >= 0)
{
if(digits[n] < 9) //数组中元素小于9,直接加1,然后返回结果
{
digits[n]++;
*returnSize = digitsSize;
return digits;
}else //数组中元素等于9时,该位置0,重复上面步骤检查前面各元素
{
digits[n] = 0;
n--;
}
}
//能走到这一步说明,数组中各个元素均为9,数组元素数要加1
int* newdigit = (int*)malloc((digitsSize+1) * sizeof(int));
newdigit[0] = 1; //进位,首位置1
for(int i = 1; i < (digitsSize+1); i++)
{
newdigit[i] = digits[i-1]; //原数组中各个元素向后移一位写入新的数组
}
*returnSize = digitsSize+1;
return newdigit; //返回结果
}
C++实现
class Solution { //相当于完成了十进制的进位
public:
vector<int> plusOne(vector<int>& digits) {
for (int i=digits.size(); i--; digits[i] = 0) //完成进位
if (digits[i]++ < 9) //先加再比较
return digits;
digits[0]++; //为了应对9、99这类数,首位置1
digits.push_back(0); //末尾加0
return digits;
}
};