2016-06-01 20 views
-2

負でない整数numを指定すると、結果に1桁だけが含まれるまで、すべての桁を繰り返し追加します。例えばJavaで数字を追加する

考えるnumが= 38、プロセスは次のようである:一つだけ桁を有する3 = 11 + 8、1 + 1 = 2 2ため、それを返します。

フォローアップ: O(1)ランタイムでループ/再帰なしで実行できますか?

私はちょうど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

のみ1桁を取得するまで、私は与えられた数とループを分割する解決策を考え出しますか?あなたの問題は何ですか? –

+0

[mcve]の作成方法をご覧ください。 –

答えて

5

あなたは順番に類似性をスポットすることによりO(1)時間で簡単に行うことができます。

は、ここに私のソリューションです。

これを行うには、何らかのbruteforceソリューションを作成する必要があります。ここでは簡単なPythonの関数です:[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, ...

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

番号の最初のカップルのために、この機能を実行するには、このような何かを取得します。数字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

私はそれをはっきりと説明したと思います。私はブルートフォースの解決策を書いた。その後、いくつかの要素の結果を確認しました。私はパターンを見て、そのパターンに一致する結果を返す簡単な関数を書いた。その後、私は、ソリューションが次の多くの要素と一致するかどうかを確認しました。 –

関連する問題