2016-06-01 101 views
-2

給定一個非負整數num,重複添加其所有數字,直到結果只有一個數字。在java中添加數字

例如:

鑑於NUM = 38,則處理是這樣的:3 + 8 = 11,1 + 1 = 2。由於2僅具有一個數字,返回它。

跟進: 你可以在O(1)運行時沒有任何循環/遞歸嗎?

我只是想出了一個解決方案,我分割給定的數字和循環,直到我只有一個數字。

這裏是我的解決方案:

public static void main(String[] args) { 
    int result = onlyDigit(385); 
    System.out.println(result); 
} 

public static int onlyDigit(int num){ 
    if(num<10) return num; 
    ArrayList<Integer> digitList = splitNum(num); 
    int result = sum(digitList); 
    while(result >= 10){ 
     digitList = splitNum(result); 
     result = sum(digitList); 
    } 
    return result; 
} 

public static int sum(ArrayList<Integer> list){ 
    int sum = 0; 
    for (Integer integer:list){ 
     sum = integer + sum; 
    } 
    return sum; 
} 

public static ArrayList<Integer> splitNum(int num){ 
    ArrayList<Integer> digitList = new ArrayList<>(); 
    while(num!=0){ 
     digitList.add(num%10); 
     num = num/10; 
    } 
    return digitList; 
} 
+0

我剛想出一個解決方案,我分割給定的數字和循環,直到我只有一個數字 – CoXier

+0

你做到了嗎?你有什麼問題? – 2016-06-01 03:21:24

+0

請參閱如何創建[mcve]。 –

回答

5

您可以輕鬆地O(1)時間序列在發現相似做到這一點。

要做到這一點,你必須寫一些bruteforce解決方案。下面是一個簡單的Python函數:

def solution(n): 
    if n < 10: 
     return n 
    return solution(sum(map(int, list(str(n))))) 

執行此功能前幾號的,你會得到這樣的事情:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, ...。正如你看到的數字1,2,...,9重複無數次。

這導致了一種簡單的方法,你可以轉換成Java:

def solution_fast(n): 
    if n == 0: 
     return 0 

    return (n - 1) % 9 + 1 

而一些非數學的理由。

n = 1000000 
r1 = [solution(i) for i in xrange(n)] 
r2 = [solution_fast(i) for i in xrange(n)] 
print r1 == r2 
+0

對不起,我還是很困惑。 – CoXier

+0

Dail不,我知道如何將它轉換成java。我只是不知道你是如何想出這個神奇的想法 – CoXier

+0

我想我已經解釋清楚了。我寫了一個暴力解決方案。之後,我檢查了幾個元素的結果。我看到了該模式並編寫了一個簡單的函數,返回與模式匹配的結果。之後,我檢查瞭解決方案是否符合許多下一個要素。 –