对于非负整数 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 示例 4: 输入: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 = 10000000000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-to-array-form-of-integer 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 public List<Integer> addToArrayForm(int[] A, int K) { }
思路1: int[]转string再转int计算 按之前刷题的经验首先想到转Integer有长度限制
这个思路先排除
思路2:入参K%10 分别按位取出数余 如34取到3和4 再把取到的值加到数组对应的位置上 进位+1
(写代码时遇到了几次提交失败
1)没考虑到最后一位有进位时没有插入
list.add(0,jw)
2)K长度个数若远大于int个数 得重新遍历K到list中
if (K>0){...
)
public static List<Integer> addToArrayForm1(int[] A, int K) { int Alen=A.length; int K1;//余数 List<Integer> list =new ArrayList<Integer>(Alen); int jw=0;//进一位 for (int i=0;i<Alen;i++){ K1=K%10; K/=10; list.add((A[Alen-1-i]+K1+jw)%10);//进位后再取余 防止大于等于10的情况出现 jw=(A[Alen-1-i]+K1+jw)>9?1:0;//下个值是否进一位 } //K位数大于数组时 if (K>0){ int klen=String.valueOf(K).length(); for (int i=0;i<klen;i++){ K1=K%10; K/=10; list.add((K1+jw)%10); jw=K1+jw>9?1:0; } } Collections.reverse(list);//也考虑过不用翻转 但这样做的话list得定义个初始值不太直观 if (jw>0) list.add(0,jw);//在最后还需进位的话在list左边插入1 return list; }
思路3:按思路1改进 Integer最大2147483647 长度10位 int[]转字符串后先判断长度 小于10位长度按思路1走 大于10位则切割成多个长度9位的数组 分开计算 计算也得考虑前一个数组是否进位
这个思路的效率应该会比思路2高