力扣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;
}
相关推荐
Wang's Blog8 小时前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog8 小时前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨13 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
萧西待水14 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
星空15 小时前
金蝶苍穹build.gradle配置
java·build.gradle
梦帮科技16 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
泯泷16 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm16 小时前
34 合并K个升序链表
javascript·算法·链表
C++ 老炮儿的技术栈17 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
步行cgn18 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring