加一

LeetCode第66题

题目描述:

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

思路

一种求法是将数组转换为数字,做算术运算加1后,再转换为数组。利用乘10的幂逐个求和来完成数组到数字的转换。求出加一值后,再利用模10来完成数字到数组的转换(注意顺序)。
另外一种求法简洁一些。从后往前遍历数组,设置进位carry,初值为1。如果当前值加上carry大于9,则carry为1,继续循环。否则,carry为0,跳出循环。最后,如果carry为0,说明最高位没有进位。返回原数组。如果carry不为0,说明最高位有进位,用malloc申请额外数组空间,大小比原数组多1,返回该数组即可。

源代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize){
    int carry = 1;
    int i;
    int tmp;
    for(i = digitsSize - 1;i >= 0;--i){
        tmp = digits[i] + carry;
        if(tmp > 9){
            carry = 1;
            digits[i] = 0;
        }
        else{
            carry = 0;
            ++digits[i];    
            break;
        }
    }
    if(carry == 0){
        *returnSize = digitsSize;
        return digits;
    }
    else{
        *returnSize = digitsSize + 1;
        int *result = (int *)malloc(sizeof(int) * (*returnSize));
        result[0] = 1;
        for(i = 1;i < (*returnSize);++i)
            result[i] = digits[i - 1];
        return result;
    }
}

分析

时间复杂度为线性级别;
最好空间复杂度为常数级别,最坏空间复杂度为线性级别。

你可能感兴趣的:(加一)