C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展

问题描述

小A是一位正在学习数字魔法的学徒,他有一个神奇的整数列表。每次施展魔法时,他需要将这个列表表示的数字整体加一,并返回加一后的新数字列表。例如,列表 [1,2,3] 表示数字 123,加一后得到 124,因此应该返回 [1,2,4]。但魔法有时会带来进位问题,比如 [9,9] 加一后变成 [1,0,0],列表长度会增加。小A希望你能帮助他高效地完成这个魔法操作。

要求:

  1. 设计一个算法,将输入的数字列表加一,并返回结果列表。
  2. 算法的时间复杂度应为 O(n),其中 n 是列表的长度。
  3. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:digits = [1,2,3] 输出:[1,2,4] 解释:数字 123 加一后是 124,所以返回 1,2,4。

样例2:

输入:digits = [9,9] 输出:[1,0,0] 解释:数字 99 加一后是 100,列表长度增加,返回 1,0,0。

样例3:

输入:digits = [0] 输出:[1] 解释:数字 0 加一后是 1,返回 1。

约束条件

  • 1 ≤ digits.length ≤ 100
  • 0 ≤ digitsi ≤ 9
  • 输入列表不包含任何前导零,除了数字0本身

程序代码

#include <stdio.h>

#include <stdlib.h>

/**

* 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--) {

if (digitsi < 9) {

// 不需要进位,直接加1返回

digitsi++;

*returnSize = digitsSize;

// 复制结果(避免修改原数组)

int* result = (int*)malloc(digitsSize * sizeof(int));

for (int j = 0; j < digitsSize; j++) {

resultj = digitsj;

}

return result;

} else {

// 当前位是9,置为0,继续进位

digitsi = 0;

}

}

// 所有位都是9,需要扩展数组

*returnSize = digitsSize + 1;

int* result = (int*)malloc((digitsSize + 1) * sizeof(int));

result0 = 1;

for (int i = 1; i <= digitsSize; i++) {

resulti = 0;

}

return result;

}

int main() {

int digits1\[\] = {1, 2, 3};

int digits2\[\] = {9, 9};

int digits3\[\] = {0};

int returnSize1, returnSize2, returnSize3;

int* result1 = plusOne(digits1, 3, &returnSize1);

int* result2 = plusOne(digits2, 2, &returnSize2);

int* result3 = plusOne(digits3, 1, &returnSize3);

for (int i = 0; i < returnSize1; i++) printf("%d ", result1i);

printf("\n");

for (int i = 0; i < returnSize2; i++) printf("%d ", result2i);

printf("\n");

for (int i = 0; i < returnSize3; i++) printf("%d ", result3i);

printf("\n");

free(result1);

free(result2);

free(result3);

return 0;

}

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

/**
 * 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--) {
        if (digits[i] < 9) {
            // 不需要进位,直接加1返回
            digits[i]++;
            *returnSize = digitsSize;
            
            // 复制结果(避免修改原数组)
            int* result = (int*)malloc(digitsSize * sizeof(int));
            for (int j = 0; j < digitsSize; j++) {
                result[j] = digits[j];
            }
            return result;
        } else {
            // 当前位是9,置为0,继续进位
            digits[i] = 0;
        }
    }
    
    // 所有位都是9,需要扩展数组
    *returnSize = digitsSize + 1;
    int* result = (int*)malloc((digitsSize + 1) * sizeof(int));
    result[0] = 1;
    for (int i = 1; i <= digitsSize; i++) {
        result[i] = 0;
    }
    return result;
}

int main() {
    int digits1[] = {1, 2, 3};
    int digits2[] = {9, 9};
    int digits3[] = {0};
    
    int returnSize1, returnSize2, returnSize3;
    
    int* result1 = plusOne(digits1, 3, &returnSize1);
    int* result2 = plusOne(digits2, 2, &returnSize2);
    int* result3 = plusOne(digits3, 1, &returnSize3);
    
    for (int i = 0; i < returnSize1; i++) printf("%d ", result1[i]);
    printf("\n");
    for (int i = 0; i < returnSize2; i++) printf("%d ", result2[i]);
    printf("\n");
    for (int i = 0; i < returnSize3; i++) printf("%d ", result3[i]);
    printf("\n");
    
    free(result1);
    free(result2);
    free(result3);
    
    return 0;
}

运行结果

相关推荐
余额瞒着我当琳7 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
程序员南飞8 小时前
win系统安装minio
java·数据结构·算法
Escalating_xu9 小时前
【C 语言】深入理解指针(4):回调函数、qsort、void * 与泛型排序的模拟实现
java·c语言·开发语言
w_zero_one9 小时前
链表(4)
java·数据结构·算法
吠品10 小时前
GitHub 周榜拆解:决策小模型扎堆上位
c语言·开发语言·算法
小师兄吃牛肉10 小时前
C语言篇:内联函数
c语言·开发语言
白山编程大哥11 小时前
C语言篇:语法进阶
c语言·数据结构·算法
Logic10112 小时前
C语言/数据结构动态规划题解:爬楼梯(含坏台阶)——避开障碍物的路径计数
c语言·数据结构·动态规划·时间复杂度·空间复杂度·算法题·爬楼梯
山下梅子酒22512 小时前
洛谷-入门-B2081
c语言
wuminyu12 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++