Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3Sum在Clojure中用于_Clojure - Fatal编程技术网

3Sum在Clojure中用于

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

我做了一个经典的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[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中不是循环结构。它是一个列表理解结构。