【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
创始人
2024-04-26 15:41:19
0

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

文章目录

  • 一、题目描述
  • 二、思路及代码实现

今天为大家带来的是力扣上的一道简单题:数组形式的整数加法。这道题我在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 数组中数据为:

image-20221219211424512

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

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

image-20221219211551991

最后由于我们这个是倒着存的,所以需要把 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;
}

完结撒花 🌹

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...