每天一道LeetCode-13(加一)

31 阅读2分钟

题目描述

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入: digits = [0]
输出: [1]

分析

在写代码时,对c语言中的指针又明确了一些基础知识,在LeetCode中,该题目中,给了三个参数 int* digits, int digitsSize, int* returnSize(如果给了returnSize,必须要在最后给returnSize赋值,returnSize是一个简单类型,赋值的时候给指向returnSize的指针赋值即可),digitls是一个数组,*digits是一个指向该数组的指针。

对数组进行加一操作,即对数组的最后一个数字进行加一,如果加一后结果小于10,则完成加一的操作,直接返回digits数组即可,注意返回的是digits数组,而不是*digits*digies表示的是该数组的第一个元素。);如果加一后结果等于10,则对前一位进行上述操作,直到加到第一位后结果仍然等于10,说明原数组元素全部为9,则需要另外申请空间,空间大小为原来元素个数加一,第一个赋值为1,其余为按照digits赋值即可。

代码实现

int* plusOne(int* digits, int digitsSize, int* returnSize){
    for(int i = digitsSize - 1; i >=0 ; i--){
        digits[i]++;
        if(digits[i] == 10){
            digits[i] = 0;
        }else{
            *returnSize = digitsSize;
            return digits;
        }
    }
    int* res = (int*)malloce((digitsSize + 1) * sizeof(int));
    res[0] = 1;
    for(int j = 0;j < digitsSize; j++){
        res[j+1] = digits[j];
    }
    *returnSize = digitsSize + 1;
    return res;
}