LeetCode 989. 数组形式的整数加法

题目:对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 1,2,3,1。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

整体思路可以归纳为以下三个关键步骤:

  1. 从低位(末尾)开始对齐相加

    像列竖式一样,必须从个位开始算。对于数组 A,我们从最后一位(索引 ASize - 1)往前遍历;对于数字 K,我们通过不断取模(K % 10)来剥离出它的个位、十位、百位。把取出的这两个数字,连同进位(初始为 0)一起相加。

  2. 处理进位,顺次存放

    每次相加后,如果结果大于 9,就意味着需要向前进一位(进位设为 1),而当前位只保留减去 10 之后的余数。计算好的数字会被按顺序依次存入一个新的结果数组 retArr 中。只要数组 A 还没遍历完、数字 K 还没除尽,或者最后还留着一个进位,这个循环相加的过程就会一直继续。

  3. 整体翻转(修正顺序)

    这是这个思路里最特别的一点:因为我们是从个位开始算,并且是从新数组的索引 0 开始存的,这就导致存进去的数字顺序是倒着的 (比如正确结果是 1035,数组里存的其实是 [5, 3, 0, 1])。因此,最后必须通过双指针不断交换首尾元素,把整个数组翻转过来,恢复成正常的数字顺序。

    复制代码
    int* addToArrayForm(int* A, int ASize, int K, int* returnSize){
        int kSize = 0;
        // 134
        int kNum = K;
        while(kNum)
        {
            ++kSize;
            kNum /= 10;
        }
    
        int len = ASize > kSize ? ASize : kSize;
        int* retArr = (int*)malloc(sizeof(int)*(len+1));
    
        // A []
        int Ai = ASize-1;
        int reti = 0;
        int nextNum = 0; // 进位
        while(len--)
        {
            int a = 0;
            if(Ai >= 0)
            {
                a = A[Ai];
                Ai--;
            }
            int ret = a + K%10 + nextNum;
            K /= 10;
    
            if(ret > 9)
            {
                ret -= 10;
                nextNum = 1;
            }
            else
            {
                nextNum = 0;
            }
    
            retArr[reti] = ret;
            ++reti;
        }
    
        if(nextNum == 1)
        {
            retArr[reti] = 1;
            ++reti;
        }
    
        int left = 0, right = reti-1;
        while(left < right)
        {
            int tmp = retArr[left];
            retArr[left] = retArr[right];
            retArr[right] = tmp;
            ++left;
            --right;
        }
    
        *returnSize = reti;
        return retArr;
    }
相关推荐
zyl7659 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖13 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌13 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F13 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791313 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032214 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!14 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
by2099914 小时前
哈希表——快速找到数据:冲突、删除与扩容的实现
数据结构·c++·哈希算法·散列表
2501_9269783314 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作
行者全栈架构师14 小时前
【鸿蒙心迹】互动卡片全链路——把核心功能放到桌面(FormKit 实战)(HarmonyOS 7.x)
前端·算法·架构