3Sum在Clojure中用于
我做了一个经典的algo练习:这个数组中有多少个三元组和为零?在Java中实现这一点没有问题:3Sum在Clojure中用于,clojure,Clojure,我做了一个经典的algo练习:这个数组中有多少个三元组和为零?在Java中实现这一点没有问题: 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
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;
int count=0;
对于(int i=0;i
但是在Clojure我该怎么做呢?我问自己:如何在Clojure中执行嵌套循环
但这并没有真正解决我的问题,因为它需要两个相同的数组并组合所有的元素(也包括相同的元素,例如1和1)
相关问题:如何从集合中获取所有三元组的组合
注意:我们被明确要求不要对数组进行排序。我知道有更快的算法
编辑:将“==0”添加到条件中。您可以在clojure中为循环使用
,方法与java中类似
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)))
回复示例,
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)]
[]))))
回复示例
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
此外,您还可以通过列表理解完成此操作,而无需操作索引:
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])
示例Java代码实际上返回了不等于零的三元组的数量……感谢@marco.m指出我的错误,非常好!为了可读性,我建议在take while
中用not empty
替换seq
。更准确地说,for
在clojure中不是循环结构。它是一个列表理解结构。