【C语言】Leetcode 66. 加一

发布于:2024-03-13 ⋅ 阅读:(49) ⋅ 点赞:(0)

文章目录


题目

链接: link

在这里插入图片描述

思路

题目的意思是把一个数以数组的形式输入,然后在这个书的末尾加一,应该是要考察,如果数加一后位数发生变化,比如999+1成1000,3位数变成4位数怎么处理的。

并且我们可以发现这种需要进一位的做法仅存在所有元素都为9的时候。

首先 我们可以先不考虑上面那种情况,假设不进位
所以一判断它不大于10,就直接输出出去。

digits[i] += 1;
if (digits[i] != 10) {
            *returnSize = digitsSize;
            return digits;

然后 再考虑可能会进一,但不会进位的情况
那就是需要把整个数组从最低位循环一遍,遇到10的进一,并且让10变成0,然后和大于10的放一起,方便离开函数

 for (int i = digitsSize - 1; i >= 0; i--) {
        digits[i] += 1;
        if (digits[i] != 10) {
            *returnSize = digitsSize;
            return digits;
        } else
            digits[i] = 0;
    }

最后 就是元素全为9的情况,这种情况较特殊,需要进位,但是好处是,他的第一位绝对是1,后面也绝对是0,于是我们可以直接开辟一块 sizeof(int)*(digitsSize+1) 大小的新的内存,将里面的所有元素都变成0,然后让首元素变成1就行了

// 元素全为9,例如999这种情况时
    int* ans = malloc(sizeof(int) * (digitsSize + 1));

    memset(ans, 0, sizeof(int) * (digitsSize + 1));
    ans[0] = 1;

    *returnSize = digitsSize + 1;
    return ans;
}

代码呈现

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* plusOne(int* digits, int digitsSize, int* returnSize) {
    for (int i = digitsSize - 1; i >= 0; i--) {
        digits[i] += 1;
        if (digits[i] != 10) { // 如果不需要进1,直接返回
            *returnSize = digitsSize;
            return digits;
        } else // 需要进一,就得把进一前的那一位变成0
            digits[i] = 0;
    }

    // 元素全为9,例如999这种情况时
    int* ans = malloc(sizeof(int) * (digitsSize + 1));
    // 开辟一块比原来数组多一位的内存,将里面的元素全部变成0
    memset(ans, 0, sizeof(int) * (digitsSize + 1));
    // 只需将首元素变成1就行了
    ans[0] = 1;

    *returnSize = digitsSize + 1;
    return ans;
}
本文含有隐藏内容,请 开通VIP 后查看