66. Plus One

第一遍C & C++

Posted by heroydx on March 13, 2018

题目分析

题目用一个非空数组去表示一个整形数字,对这个数字加一处理后,依然用非空数组去表示。

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;    
    }
};

总结反思

C++ vector用法小记

C语言中malloc、calloc、realloc和free函数的使用方法