這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!