2017-09-22 2 views
2

私はこの古典的な練習をしました:この配列では、いくつのトリプルが合計で0になりますか?これをJavaで実装するのに問題はありません。3を使用してClojureで使用する

int count = 0; 
for (int i = 0; i < array.length - 2; i++) { 
    (for int j= i+1; j < array.length -1; j++) { 
    (for int k = j + 1; k < array.length; k++) { 
     if (array[i] + array[j] + array[k] == 0) { 
     count++; 
     } 
    } 
    } 
} 
return count; 

Clojureではどうしたらいいですか?私は自分自身に尋ねました:Clojureでネストループを実行するにはどうすればいいですか?

しかし、this question and answerは、2つの同一の配列を取り、すべての要素(同じ要素、例えば1と1など)を組み合わせるので、実際に私の問題には対処しません。

関連する質問:コレクションからトリプルのすべての組み合わせを取得するにはどうすればよいですか?

注:アレイを並べ替えないよう明示的に求められました。私はこれのためのより高速なアルゴリズムがあることを知っています。

EDIT:条件に "== 0"を追加しました。

+0

サンプルJavaコードは、実際に何個のトリプルが0にならないかを返します。 –

+0

ありがとう私のミスを指摘するための@ marco.m –

答えて

6

あなたは、すべてのインデックスを操作することなく、リスト内包でそれを行うことができます。

user> (def data [1 -2 1 1 -3 2]) 
#'user/data 

user> (defn tails [data] 
     (take-while seq (iterate rest data))) 
#'user/tails 

user> (for [[x & xs] (tails data) 
      [y & ys] (tails xs) 
      [z] (tails ys) 
      :when (zero? (+ x y z))] 
     [x y z]) 

;;=> ([1 -2 1] [1 -2 1] [1 -3 2] [-2 1 1] [1 -3 2] [1 -3 2]) 
+0

非常に良い!私は可読性のために 'seq'を' take-while'の 'not-empty'に置き換えることを提案します。 –

3

javaと同様に、クロージャーでforループを使用できます。

1計算0に組み合わせ和だけカウント、

(defn three-sum-count [array] 
    (let [three_sum 
     (for [i (range 0 (- (count array) 2)) 
       j (range (+ 1 i) (- (count array) 1)) 
       k (range (+ 1 j) (count array))] 
      (if (zero? (+ (get array i) (get array j) (get array k))) 1 0))] 
    (reduce + three_sum))) 

REPL例、

user=> (three-sum-count [1, -2]) 
0 
user=> (three-sum-count [1, -2, 1]) 
1 
user=> (three-sum-count [1, -2, 1, 1]) 
3 
user=> (three-sum-count [1 -2 1 1 -3 2]) 
6 

2一覧ゼロに全ての組み合わせ和、

(defn three-sum-combinations [array] 
    (remove empty? 
      (for [i (range 0 (- (count array) 2)) 
       j (range (+ 1 i) (- (count array) 1)) 
       k (range (+ 1 j) (count array))] 
      (if (zero? (+ (get array i) (get array j) (get array k))) 
       [(get array i) (get array j) (get array k)] 
       [])))) 

REPL例

user=> (three-sum-combinations [1, -2]) 
() 
user=> (three-sum-combinations [1, -2, 1]) 
([1 -2 1]) 
user=> (three-sum-combinations [1, -2, 1, 1]) 
([1 -2 1] [1 -2 1] [-2 1 1]) 
user=> (three-sum-combinations [1 -2 1 1 -3 2]) 
([1 -2 1] [1 -2 1] [1 -3 2] [-2 1 1] [1 -3 2] [1 -3 2]) 

あなたはまた、どのように多くの組み合わせをこのように計算することができ、

user=> (count (three-sum-combinations [1 -2 1 1 -3 2])) 
6 
+0

もう少し正確であるために、 'for'はclojureのループ構造ではありません。それはリストの理解の構造です。 https://clojuredocs.org/clojure.core/for – Josh

関連する問題