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

题目描述

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

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

你可以假设除了整数 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

个人题解

cs 复制代码
/**
 * 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;
}

官方题解:

cs 复制代码
#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;
}
相关推荐
MacroZheng2 小时前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
CoovallyAIHub3 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
用户0332126663673 小时前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧3 小时前
ThreadLocal实现原理与应用实践
java
若水不如远方3 小时前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
用户7493636848433 小时前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java
SimonKing3 小时前
一键开启!Spring Boot 的这些「魔法开关」@Enable*,你用对了吗?
java·后端·程序员
CoovallyAIHub4 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
间彧4 小时前
Spring Boot集成Spring Security 6.x完整指南
java
xiezhr5 小时前
用户只需要知道「怎么办」,不需要知道「为什么炸了」
java·api·接口设计规范