龙空技术网

LeetCode算法第989. Add to Array-Form of Integer

吾是我师 120

前言:

而今同学们对“js array add”大体比较注意,兄弟们都想要了解一些“js array add”的相关内容。那么小编同时在网摘上搜集了一些关于“js array add””的相关知识,希望姐妹们能喜欢,朋友们一起来学习一下吧!

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 989. 数组形式的整数加法(Add to Array-Form of Integer)

问题描述:

对于非负整数X, X的数组形式是其数字按从左到右的顺序排列的数组。例如,如果X = 1231,那么数组形式是[1,2,3,1]。给定非负整数X的数组形式A,返回整数X+K的数组形式。

注:

1 <= A.length <= 10000;0 <= A[i] <= 90 <= K <= 10000;如果 A.length > 1, 则 A[0] != 0;示例:C语言实现:

这里不太好搞的是如何确定返回的数组的长度。

除非计算K的位数后再和A的长度进行比较,但是因为可能存在进位导致新数长度增加,所以不知道X+K的结果的情况下,还是无法精确的知道这个长度值(例如X=99,K=1)。

我的方法是,不去精确的计算这个长度值,只通过简单分析大概确定它的上确界。然后根据这个长度先创建出一个数组res,在从一个方向上填充数组,完成后,计算已填充的长度和起始地址,返回即可。

为了避免元素的反转或移动,我们从尾部向头部添加元素到res中。这个过程可以形象的看成列竖式的方式计算X+K,即从个位向十位百位...做加法。

计算结束后,计算出要返回的数组的起始地址以及长度。

算法过程如下图所示:

详细代码如下:

代码第8行,首先定义一个整数len来作为要返回数组res的最大长度。

由于K是一个int类型的数值,所以K的位数不会超过10,但是X的值位数即数组A的长度题目给的限制最大可以达到10000。又X和K相加后,新的数的位数可能由于进位而大于X和K中位数最大的那个。所以len的取值有:

当ASize大于10的时候,显然这时候X要大于K,ASize的长度起决定作为,考虑进位,len取值为ASize+1;否则K的位数不小于X,考虑进位,len的长度不会超过11;

确定好len后,我就可以创建res数组。

代码10~15行,对数组A从右向左遍历。

我们将A的每一位数和K相加,它的余数就是该位加后变化的数,它的除数重新赋值给K进入到下一轮。

这样遍历完A以后,如果A的长度,即X原来的位数大于K的位数,那么这个时候,K应该已经等于0了;否则,如果K位数大于X的位数或者K和X的位数相等,但是由于进位导致新的数位数增加了,那么K这个时候还不为0,还要接着处理。

所以如代码16行,对剩下的K的值进行处理,直到K为0。

代码17行计算要返回的数组的长度,注意这里len是长度(起始是1),j是下标(起始是0),所以计算长度要减1;同样,代码18行,获得数组起始地址的方式要加1。

Java语言实现:

Java 算法的思想和C语言大体是类似的。也是先从右向左遍历数组A,并做相应的操作;遍历结束后再检查K是否有剩余,再处理。

我们创建一个LinkedList对象res来保存结果。

为什么不用ArrayList?这是因为,我们的算法要求每次都追加元素到List头部,对于ArrayList来说,它的内部是一个数组,而追加元素到数组的头部,开销会比较大。而LinkedList内部是一个链表,首尾追加元素都可以直接操作。

这里注意不要将res类型设置为List类型。因为后面要用到LinkedList的addFirst方法,而不是add方法,addFirst方法是LinkedList独有的。

代码如下:

Python语言实现:

对于Python 我测试了好几个方法。

首先是将A转换回X后,计算出X+K后,再将其转换成数组形式。

光这一种思路,就可以写出好几种实现方式,我分别测试了用map实现,用循环和列表生成器的实现,结果都是性能不佳,有时候甚至会提示运行超时。

所以我又测试了和上面C语言的实现思路类似的做法,结果表现还可以。

代码如下:

谢谢大家一直以来的关注和支持!

我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《吾是我师》,谢谢!

标签: #js array add