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;
}

运行结果

相关推荐
挖井观天17 小时前
《Java数据结构》第一讲:顺序表
数据结构
lhbweilai18 小时前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
艾络迅Acceleronix19 小时前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
炘爚19 小时前
数据结构算法总结
数据结构·python·算法
Zwawa19 小时前
一只按键不只“按下”:短按、长按和连按如何共存
c语言·单片机·嵌入式
见叶之秋20 小时前
【C++】红与黑的边界:红黑树从插入到自检
数据结构·c++·算法·面试
kiracrimson21 小时前
string 容器:从 C 字符串到会自己扩容的类
开发语言·数据结构·c++·stl
wyhwust1 天前
程序设计基础--C语言输入输出单元测试
c语言·开发语言
CQU_JIAKE1 天前
10.25【A】
数据结构·算法
another heaven1 天前
【C/C++ C++ 面向对象架构的五大特点与能力场景:封装、继承、多态、抽象与 RAII(含实战案例)】
c语言·c++·架构