力扣C语言刷题记录(四)加一

发布于:2024-12-07 ⋅ 阅读:(51) ⋅ 点赞:(0)

题目描述

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

个人题解

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void printArray(int *arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int *plusOne(int *digits, int digitsSize, int *returnSize)
{
    int nine_counts = 0;
    int continuous_nine_couts_flag = 0;
    int current_index = 0;
    int new_digitsSize = digitsSize + 1;
    int *new_digits = (int *)malloc(new_digitsSize * sizeof(int));
    if (digits[digitsSize - 1] != 9)
    {
        digits[digitsSize - 1] = digits[digitsSize - 1] + 1;
        *returnSize = digitsSize;
        return digits;
    }

    nine_counts = 1;
    continuous_nine_couts_flag = 1;
    for(int i = digitsSize - 1; i >= 1; i--)
    {

        if (continuous_nine_couts_flag == 1)
        {
            if ((digits[i] == 9) && (digits[i - 1] == 9))
            {
                digits[i] = 0;
                nine_counts++;
                continuous_nine_couts_flag = 1;
            }
            else
            {
                digits[i] = 0;
                current_index = i;
                continuous_nine_couts_flag = 0;
                break;
            }
        }
    }

    if (nine_counts < digitsSize)
    {
        printf("nine_counts: %d\n", nine_counts);
        printf("current_index: %d\n", current_index);
        *returnSize = digitsSize;
        digits[digitsSize - 1 - nine_counts] = digits[digitsSize - 1 - nine_counts] + 1;
        return digits;
    }
    else if(nine_counts == digitsSize)
    {
        digits[0] = 0;
        for(int i = digitsSize - 1; i >= 0; i--)
        {
            new_digits[i + 1] = digits[i];
        }
        new_digits[0] = 1;
        *returnSize = new_digitsSize;
        return new_digits;
    }


}

int main()
{
    int digits1[] = {1, 2, 3};
    int digitsSize1 = 3;
    int returnSize1;
    int *result1 = plusOne(digits1, digitsSize1, &returnSize1);
    printf("Test Case 1: ");
    printArray(result1, returnSize1);
    assert(returnSize1 == 3 && result1[0] == 1 && result1[1] == 2 && result1[2] == 4);

    int digits2[] = {8, 9, 9};
    int digitsSize2 = 3;
    int returnSize2;
    int *result2 = plusOne(digits2, digitsSize2, &returnSize2);
    printf("Test Case 2: ");
    printArray(result2, returnSize2);
    assert(returnSize2 == 3 && result2[0] == 9 && result2[1] == 0 && result2[2] == 0 );


    int digits3[] = {9, 9, 9};
    int digitsSize3 = 3;
    int returnSize3;
    int *result3 = plusOne(digits3, digitsSize3, &returnSize3);
    printf("Test Case 3: ");
    printArray(result3, returnSize3);
    assert(returnSize3 == 4 && result3[0] == 1 && result3[1] == 0 && result3[2] == 0 && result3[3] == 0);




    printf("All test cases passed!\n");

        // Free dynamically allocated memory if any
        // In this case, no need to free as the return array is either the same or a new one which is not freed here
        if (result2 != digits2)
    {
        free(result2);
    }
    return 0;
}

官方题解:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void printArray(int *arr, int size)
{
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int *plusOne(int *digits, int digitsSize, int *returnSize)
{
    // Start from the last digit and move left
    for (int i = digitsSize - 1; i >= 0; i--)
    {
        if (digits[i] == 9)
        {
            digits[i] = 0; // Set current digit to 0
        }
        else
        {
            digits[i] += 1; // Increment the current digit
            *returnSize = digitsSize;
            return digits; // Return the modified array
        }
    }

    // If all digits were 9, we need an extra digit
    int *new_digits = (int *)malloc((digitsSize + 1) * sizeof(int));
    new_digits[0] = 1; // Set the first digit to 1
    for (int i = 1; i <= digitsSize; i++)
    {
        new_digits[i] = 0; // Set the rest to 0
    }
    *returnSize = digitsSize + 1;
    return new_digits;
}


网站公告

今日签到

点亮在社区的每一天
去签到

热门文章