草庐IT

【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法

安 度 因 2023-04-22 原文

👑作者主页:@进击的安度因
🏠学习社区:进击的安度因(个人社区)
📖专栏链接:每日挠头算法题

文章目录

如果无聊的话,就来逛逛 我的博客栈 吧! 🌹

今天为大家带来的是力扣上的一道简单题:数组形式的整数加法。这道题我在2个月前就尝试过,但是没有解答出来。两个月后再做这道题目,就变得没那么难了。这次我将以高精度加法进行求解,让我们开始吧!

一、题目描述

链接989. 数组形式的整数加法

描述

整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。

  • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1]
    给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k数组形式

示例1

输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例2

输入:num = [2,7,4], k = 181
输出:[4,5,5]
解释:274 + 181 = 455

示例3

输入:num = [2,1,5], k = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

提示:

  • 1 <= num.length <= 10^4
  • 0 <= num[i] <= 9
  • num 不包含任何前导零,除了零本身
  • 1 <= k <= 10^4

二、思路及代码实现

这道题题目大意就是:将数组转化为整数与整数 k 相加后的结果存入新数组中,将结果返回

比如 num = [1, 2, 0, 0], k = 34,计算后,返回结果就是 [1, 2, 3, 4]

但是可能有进位的存在,比如 [2, 1, 5]806 相加就会变成 1021原本数组大小就不够了

总结一下 numk 相加后的情况

  • 相加结果等于 num 数组位数
  • 相加结果等于 k 的位数
  • 相加结果比 numk 中较大的多 1

题目给定了 num 数组的大小 ,那么我只要求出 k 的大小然后比较一下,取较大的一个作为返回数组长度开辟空间时多开辟一个空间方便进位 就好了 。

考虑到进位的问题,所以这道题目我采用了 高精度加法 。其实博主之前只是大概知道高精度加法,所以做题目的时候专门去查了一下高精度加法是怎么使的。

高精度加法其实就是几个步骤:倒序存储数字 → 计算 → 存出结果

至于为什么倒着存,就是方便进位嘛,你想想对于一个数来说是在0下标前进位简单,还是在数组末尾进位简单?那当然是在数组末尾,因为往后偏移一个下标就可以。

对于这题算出长度 len ,开个 len + 1 大小的数组来处理 进位

然后就是相关变量的定义

  • oldNum :记录 num 数组中的数据
  • oldSize :记录原数组的下标
  • nextNum :存储相加后的数据,并判断是否进位
  • cnt :当前返回数组中的元素个数

计算并存储的过程

  1. 遍历 返回数组 res ,倒着取 num 数组元素,存到 oldNum 中,并 oldSize--

  2. 然后将 oldNumk % 10 ( k 对应位数的值) 的和 累加到 nextNum 中 。

  3. nextNum 的有效数字存入 res 数组当前位置,并将 cnt++ ,表示 res 数组有效数据位数增加。

  4. 再把 nextNum / 10 ,看结果是否为1,为 1 则有 进位

  5. 最后调整一下 kk / 10 去掉一位。

循环往复如上过程,也就基本把数据 倒着 存到了 res 数组中

但是注意了!!!

我们只遍历 len 次,只能计算出 相加结果等于 num 数组位数相加结果等于 k 的位数 的情况。

比如 num = [2, 1, 5] k = 806 的情况,在经过上述过程中,res 数组中数据为:

这样没有考虑到进位的情况。

所以退出循环时,如果 相加结果有进位的话(nextNum == 1) ,是要额外处理一下的。就是在 cnt 下标处填 1 ,然后把 cnt++

最后由于我们这个是倒着存的,所以需要把 res 数组的有效数据逆置一下

提一句:逆置的有效数据就是 cnt 的个数。因为我们先开始多开了一个空间,在没有进位的情况中,多开空间的位置是不会被填入数据的。

最后算出来,将 res 数组返回就好了。

接下来看看代码怎么写:

/*
 * oldNum  num数组中的数据
 * oldSize num数组的下标
 * nextNum 判断是否进位
 * cnt     res数组中有效数据的个数
 */

int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
    // 算出 k 的位数
    int kSize = 0;
    int tmp = k;
    while (tmp) {
        ++kSize;
        tmp /= 10;
    }
    // 比较 k 和 数组的长度,求大的
    int len = numSize > kSize ? numSize : kSize;

    // 多开一个空间,以便进位
    int* res = (int*)malloc(sizeof(int) * (len + 1));

    // 高精度加法
    int oldNum = 0, oldSize = numSize - 1, nextNum = 0, cnt = 0;
    for (int i = 0; i < len; ++i) {
        oldNum = 0;
        if (oldSize + 1) {
            oldNum = num[oldSize--];
        }
        nextNum += oldNum + k % 10;
        res[cnt++] = nextNum % 10;
        nextNum /= 10;
        k /= 10;
    }
    if (nextNum) {
        res[cnt++] = 1;
    }
    // 将有效数据逆置
    int l = 0, r = cnt - 1;
    while (l < r) {
        int tmp = res[l];
        res[l] = res[r];
        res[r] = tmp;
        l++;
        r--;
    }
    *returnSize = cnt;
    return res;
}

完结撒花 🌹

有关【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法的更多相关文章

  1. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  2. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  3. ruby-on-rails - 嵌套形式的 HABTM 复选框 - 2

    我正在尝试以嵌套形式实现HABTM复选框。目前,我有3个模型。主题、类(class)和小组。协会如下:每个科目都有很多课。每节课都属于许多小组。现在,我正在尝试在单个创建和编辑表单上实现它们。这样一节课嵌套在主题中,每节课都有一个组复选框列表来实现HABTM关系。我在实现HABTM关系时遇到了麻烦,因为每个科目都有很多类(class),而且我不确定如何区分不同的类(class)。为了进一步详细说明,我能够使嵌套表单正常工作,但我无法让HABTM复选框保存到正确的类(class)中。以下代码示例是我的HABTM复选框实现。目前,我已经使用“subject[lessons_attribut

  4. ruby-on-rails - 如何使用 globalize 和 rails 4 以一种形式显示所有翻译字段 - 2

    在使用rails4和https://github.com/globalize/globalize的情况下,我应该如何为我的模型编写表单?用于翻译。我想以一种形式显示所有翻译,如下例所示。我在这里找到了解决方案https://github.com/rilla/batch_translations但我不知道如何实现它。这个“批量翻译”是一个gem还是什么?以及如何安装它。EditingpostEnglish(defaultlocale)SpanishtranslationFrenchtranslation 最佳答案 批处理翻译gem很旧

  5. ruby - 强制 Ruby 不以标准形式/科学记数法/指数记数法输出 float - 2

    我遇到了同样的问题here对于python,但对于ruby​​。我需要输出这样一个小数字:0.00001,而不是1e-5。有关我的特定问题的更多信息,我正在使用f.write("Mynumber:"+small_number.to_s+"\n")输出到一个文件对于我的问题,准确性不是什么大问题,所以只做一个if语句来检查是否small_number那么更通用的方法是什么? 最佳答案 f.printf"Mynumber:%.5f\n",small_number您可以将.5(小数点右侧5位数字)替换为您喜欢的任何特定格式大小,例如,%8

  6. IDEA使用LeetCode插件 - 2

    前言我们习惯用idea编写、调试代码,在LeetCode上刷题时,如果能够在IDEA编写代码,并且做好代码管理,是一件事半功倍的事情。对于后续复习题目,做笔记也会非常便利。本文目的在于介绍LeetCodeEditor的使用,以及配置工具类,最终目录结构如下:note:放置笔记src:放置代码leetcode.editor.cn:插件LeetCodeEditor自动生成utils:自定义的工具包,可用于自动化输入测试用例,定义题目需要的类(结构体)out:运行测试时自动生成LeetCodeEditorGitHub:https://github.com/shuzijun/leetcode-edit

  7. ruby - 是否有可能在 Ruby 中以哈希的形式访问关键字参数? - 2

    我知道我能做到:classParentdefinitialize(args)args.eachdo|k,v|instance_variable_set("@#{k}",v)endendendclassA但我想使用关键字参数来更清楚地说明可以接受哪个散列键方法(并进行验证表明不支持此键)。所以我可以写:classAdefinitialize(param1:3,param2:4)@param1=param1@param2=param2endend但是有没有可能写一些更短的东西而不是@x=x;@y=y;...从传递的关键字参数初始化实例变量?是否可以访问作为哈希传递的关键字参数?

  8. ruby-on-rails - 如何以一种形式编辑多个模型? - 2

    我从教练那里接到了任务。我想以一种形式编辑两个模型。例如,我们有两个实体学生和地址。在新学生部分,我想添加学生详细信息和地址。我如何通过ruby​​onrails中的脚手架实现这一目标? 最佳答案 您可以使用accepts_nested_attributes_for和fields_for建立一个表格来同时创建两个模型,所以你也可以编辑它们。这种形式称为嵌套形式。这里有一个关于Nestedform的引用给你,. 关于ruby-on-rails-如何以一种形式编辑多个模型?,我们在Stack

  9. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  10. Python:每日一题之小张的衣服(优先队列、哈夫曼编码) - 2

    题目描述小张买了 n 件白色的衣服,他觉得所有衣服都是一种颜色太单调,希望对这些衣服进行染色,每次染色时,他会将某种颜色的所有衣服寄去染色厂,第 i 件衣服的邮费为 ai​ 元,染色厂会按照小张的要求将其中一部分衣服染成同一种任意的颜色,之后将衣服寄给小张,请问小张要将 n 件衣服染成不同颜色的最小代价是多少?输入描述第一行为一个整数 n ,表示衣服的数量。第二行包括 n 个整数a1​,a2​...an​ 表示第 i 件衣服的邮费为 ai​ 元。(1≤n≤10^5,1≤ai​≤10^9 )输出描述输出一个整数表示小张所要花费的最小代价。输入输出样例输入551321输出25 思考🤔:题意:意思是

随机推荐