这是悦乐书的第371次更新,第399篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第233
题(顺位题号是989
)。对于非负整数X
,X
的数组形式是从左到右顺序的数字数组。例如,若是X = 1231
,则数组形式为[1,2,3,1]
。算法
给定非负整数X
的数组形式A
,返回整数X + K
的数组形式。例如:数组
输入:A = [1,2,0,0],K = 34
输出:[1,2,3,4]
说明:1200 + 34 = 1234数据结构
输入:A = [2,7,4],K = 181
输出:[4,5,5]
说明:274 + 181 = 455code
输入:A = [2,1,5],K = 806
输出:[1,0,2,1]
说明:215 + 806 = 1021orm
输入:A = [9,9,9,9,9,9,9,9,9,9],K = 1
输出:[1,0,0,0,0,0,0,0,0,0,0]
说明:9999999999 + 1 = 10000000000io
注意:class
1 <= A.length <= 10000变量
0 <= A [i] <= 9数据结构与算法
0 <= K <= 10000
若是A.length > 1,则A[0]!= 0。
题目的意思是要咱们把K
(低位到高位)每一位数加到A
(从后往前)中对应位上,最后输出一个List
。
思路:先处理K
,每次拿A
的个位数,使用对10
取余获得,再从A
中取一位数出来(从后往前),两数相加,须要判断是否有进位产生,将和添加进List
中,K
再除以10,切换到新的个位数,直到K
等于0。处理完K
后,若是A
中还有数没处理完,须要再处理下,在前面处理K
时遗留的进位依旧须要参与运算,直处处理完A
中全部元素。最后,若是存进位的变量还有值,则须要将其添加进List
中。由于处理数据是从后往前的顺序,因此须要将List
反转,借助Collections
的reverse
方法完成。
public List<Integer> addToArrayForm(int[] A, int K) { List<Integer> result = new ArrayList<Integer>(); int i = A.length-1, tem = 0; while (K > 0) { // i须要判断一次,由于A的长度可能比K的位数小 int current = K%10 + (i >=0 ? A[i--] : 0) + tem; // 大于10会产生进位 if (current >= 10) { current -= 10; tem = 1; } else { tem = 0; } result.add(current); K /= 10; } // 若是K已经处理完了,可是A中还有数没有处理 while (i >= 0) { // 依旧须要判断进位 if (A[i]+tem >= 10) { result.add(A[i]+tem-10); tem = 1; } else { result.add(A[i]+tem); tem = 0; } i--; } // 判断最高位是否存在进位 if (tem != 0) { result.add(tem); } // 反转result Collections.reverse(result); return result; }
咱们还能够对第一种解法再简化下。
思路:将A中每次从后往前取的数,加到K
上面(K
最大为10000,不存在越界问题),而后每次取K
的最后一位数(借助取余),计算完后将K
除以10,直到K
等于0。
public List<Integer> addToArrayForm2(int[] A, int K) { List<Integer> result = new ArrayList<Integer>(); int i = A.length-1, tem = K; while (i >= 0 || tem > 0) { if (i >= 0) { tem += A[i--]; } result.add(tem%10); tem /= 10; } // 反转result Collections.reverse(result); return result; }
算法专题目前已连续日更超过七个月,算法题文章239+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!