Leetcode 66. 加一 【C++/C详细解法】

题目链接

解题思路 1

当对最后一个整数加一的时候,会有下面三种情况:

  1. 不需要进位
    Leetcode 66. 加一 【C++/C详细解法】_第1张图片
    Leetcode 66. 加一 【C++/C详细解法】_第2张图片
  2. 进位,但是数组长度不变
    Leetcode 66. 加一 【C++/C详细解法】_第3张图片

Leetcode 66. 加一 【C++/C详细解法】_第4张图片

  • 进位,数组长度改变
    Leetcode 66. 加一 【C++/C详细解法】_第5张图片
    Leetcode 66. 加一 【C++/C详细解法】_第6张图片
    考虑到第三种情况,可以一开始就开辟+1个元素的数组。
    int* retarr = (int*)malloc(sizeof(int)*(digitsSize+1));

  • 通过遍历数组,因为+1会有进位的情况,所以需要构造一个循环,循环结束后会有i++,并且nextnum的值有0或者1的情况。

  • 当nextnum的是0的时候,return的数组长度时i;当nextnum是1的时候,就需要额外开辟的空间放置进位,return的数组长度是i+1;

  • 因为+1是从个位开始的,所以retarr现在的数是逆序的,最后需要转置一下再输出。

代码 1

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize){
    int* retarr = (int*)malloc(sizeof(int)*(digitsSize+1));
    int i = 0, nextnum = 0;

    while(i < digitsSize)
    {
        if(i==0)
            retarr[i] = digits[digitsSize-1-i] + 1;
        else
            retarr[i] = digits[digitsSize-1-i] + nextnum;

        if(retarr[i] > 9)
        {
            retarr[i] = 0;
            nextnum = 1;
        }
        else
            nextnum = 0;
        i++;
    }

    if(nextnum == 1)
    {
        retarr[i] = nextnum;
        *returnSize = i+1;
    }
    else
    {       
        retarr[i] = 0;
        *returnSize = i;
    }

    int left = 0, right = *returnSize-1;
    while(left <= right)
    {
        int tmp = retarr[left];
        retarr[left] = retarr[right];
        retarr[right] = tmp;
        left++;
        right--;
    }

    return retarr;
}

解题思路 2

在第一种解题思路的基础上进行优化。
不需要对全部整数进行遍历,因为题目只是+1,所以没有进位的时候(可以假设除了整数 0 之外,这个整数不会以零开头),可以直接return了;有进位的时候,当前的数就置为0,因为不会返回就进入下一次循环,下一个数++。
如果遍历完所有的数都没有返回,说明还有一个进位 1, 同时其他所有的数都是 0。

代码 2

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i = digits.size()-1; i >= 0; i--)
        {
            digits[i]++;
            digits[i] %= 10;
            //没有进位  直接return
            if(digits[i] != 0)
                return digits;
        }
        vector<int> ret(digits.size()+1);
        ret[0] = 1;
        return ret;
    }
};

你可能感兴趣的:(探索时期的博客,leetcode)