IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode989.数组形式的整数加法 -> 正文阅读

[数据结构与算法]leetcode989.数组形式的整数加法

题目简介:

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

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

示例 1:

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

示例 2:

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

示例 3:

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

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

思路:把A数组里面的数看成是一个大数(比如[1,2,3,4]就看作是1234)与K相加,那么具体应该怎么实现呢?将K的个位数与数组中最后一个元素相加,将K的十位数与数组中倒数第二个元素相加依次类推。

第一步先求出k是几位数

代码如下:

int Ksize = 0;//记录k是几位数
int knum = k;
while(knum)
{
  Ksize++;
  Knum/=10;
}

这里为什么不直接用k而是要用knum呢?

因为在这里用了k之后,k的值就会发生改变,到后面我们需要再用k的时候,k就不是原来的值了。

第二步:动态开辟一个数组

代码如下:

int len = ASize>kSize?ASize:kSize;
int *retArr = (int*)malloc(sizeof(int)*(len+1));

这里动态开辟数组,那我们应该开一个多大的呢?为什么要开这么大?

我们应该开一个Ksize与Asize中的较大值+1的值。因为假如A是三位数,k也是三位数,那么A+k的结果有可能是三位数也有可能是四位数,所以我们得考虑所有的情况,因此要开一个Ksize与Asize中较大值+1的值

?第三步:求出它俩每一位相加的和

代码如下:

int Ai = ASize-1;
int reti = 0;
int New = 0;//记录进位
//这个时候需要弄一个循环让它俩相加,并把加的值放到新开辟数组里面去
//注意:这里相加的值是倒着加的值,因此后面我们还需要将新数组的值逆置一下
while(len--)
{
    int a = 0;
    //防止越界
    if(Ai>=0)
    {
        a = A[Ai];
        Ai--;
    }
  int ret = a + k%10 + New;
  k/=10;
  if(ret>9)
  {
      ret-=10;
      New = 1;
  }
  else
  {
      New = 0;
  }
  retArr[reti] = ret;
  reti++;
}
if(New==1)
{
    retArr[reti] = 1;
    reti++;
}

大家看到第三步的这些代码,肯定心里还会有一些疑问,接下来我会为大家依次解惑。

(一):我们需要弄一个循环让它俩相加,并把它俩相加的值放到数组里面,那么循环结束的条件是什么呢?为什么?

循环结束的条件应该是ASize与KSize中的较大值(也就是len--)变为0时结束,因为假如以小的作为结束条件,那么我们后面相加的值就不会再算了也就得不到我们想要的结果了。

(二)为什么需要创建一个a变量来防止Ai越界

?假如我们的代码写成这样:

int ret = A[Ai]+k%10+New;
Ai--;
k/=10;

但假如我们创建一个a变量,如果Ai>=0的时候就将A[Ai]的值赋给a,然后Ai--;如果Ai为0的时候那个if语句就不会进去,而此时a=0,即使+a也是+0,因此这样做就可以很好地避免了Ai越界的情况。

(三)为什么在while循环外面还要写一个if(New==1)这样的语句呢?

为什么会这样呢?这是因为当KSize与ASize的位数一样时,它俩相加的值,最后可能会发生进位,但是循环只执行了len次,因此最后就不会将进位的值给输出,那么我们在外面再加上一个if(New==1)的if语句并且将进位的1赋给新数组的话就不会出现这个问题了。?

第四步:数组逆置

代码如下:

//由于前面是倒着加的,所以离最后的值我们还需要逆置一下
int left = 0,right = reti-1;
while(left<right)
{
    int temp = retArr[left];
    retArr[left] = retArr[right];
    retArr[right] = temp;
    left++;
    right--;
}

完整代码如下:

int* addToArrayForm(int* A, int ASize, int k, int* returnSize){
int kSize = 0;//记录k是几位数
int knum = k;//把k的值赋给它来算k是几位数
//134
while(knum)
{
    kSize++;
    knum/=10;
}

//动态开辟一个数组,这个数组是ASize与kSize中较大的值+1
int len = ASize>kSize?ASize:kSize;
int *retArr = (int*)malloc(sizeof(int)*(len+1));

int Ai = ASize-1;
int reti = 0;
int New = 0;//记录进位
//这个时候需要弄一个循环让它俩相加,并把加的值放到新开辟数组里面去
//注意:这里相加的值是倒着加的值,因此后面我们还需要将新数组的值逆置一下
while(len--)
{
    int a = 0;
    //防止越界
    if(Ai>=0)
    {
        a = A[Ai];
        Ai--;
    }
  int ret = a + k%10 + New;
  k/=10;
  if(ret>9)
  {
      ret-=10;
      New = 1;
  }
  else
  {
      New = 0;
  }
  retArr[reti] = ret;
  reti++;
}
if(New==1)
{
    retArr[reti] = 1;
    reti++;
}

//由于前面是倒着加的,所以离最后的值我们还需要逆置一下
int left = 0,right = reti-1;
while(left<right)
{
    int temp = retArr[left];
    retArr[left] = retArr[right];
    retArr[right] = temp;
    left++;
    right--;
}

*returnSize = reti;
return retArr;
}

我认为这道题只要把思路理清了理顺了,其实并不难,但是需要你非常地细心(需要考虑的东西比较多)才行,不然你写完之后去运行可能就会出现错误。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:45:19  更:2021-10-11 17:45:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:48:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码