【问题标题】:Find triangles in a list of random numbers在随机数列表中查找三角形
【发布时间】:2015-03-15 04:08:46
【问题描述】:

我将每个元素作为“sum”、“first”和“sec”。如果 (first + sec

public void findTriangle(int[] a){

    HashSet<HashSet<Integer>> triangle = new HashSet<HashSet<Integer>>();
    HashSet<Integer> tmp;
    for(int i=0;i<a.length;i++){
        int sum=a[i];
        for(int j=0;j<a.length;j++){
            int first = a[j];
            if(first!=sum){
                for(int k=0;k<a.length;k++){
                    int sec = a[k];
                    if(sec!=first && sec!=sum && (first + sec < sum)){
                        tmp = new HashSet<Integer>();
                        tmp.add(first);
                        tmp.add(sec);
                        tmp.add(sum);
                        triangle.add(tmp);
                    }
                }       
            }
        }

    }

    for(HashSet<Integer> hs : triangle)
        System.out.println(hs);
}

【问题讨论】:

  • 如果它已经在工作,它可能更适合 CodeReview。一项改进是不从您的方法内部打印到标准输出。返回 HashSet。
  • 一般来说这是不好的做法。最明显的原因是您将该方法的使用绑定到 System.out。如果方法中需要输出,最好传入流;它更灵活。不过,这种情况对您来说可能并不重要。
  • 如果你不在那里打印它只会更干净一点,因为该方法负责一件事:处理数字。其他人可以负责打印它们。确切地解释原因需要一段时间,但如果您尝试让所有事情都尽可能少做,事情就会变得更好。
  • 我有点困惑。如果您有三个数字 A、B、C 和 A + B 不能用这些边组成一个三角形? (P.S. 仅仅将其更改为 &gt; 是行不通的。您必须确保 A + B > C 其中 C 是三个中最大的。)
  • 此外,您的代码似乎希望所有 a[i] 都不同。如果其中任何一个相同,您的代码将丢失所有等腰三角形和等边三角形。

标签: java arrays triangle-count


【解决方案1】:

对数组进行排序并将三元组添加到列表中 -

public static ArrayList<ArrayList<Integer>> get(int[] input) {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    if (input.length < 3) {
      return result;
    }
    Arrays.sort(input);
    for (int i = 0; i < input.length - 2; i++) {
      int k = i + 2;
      for (int j = i + 1; j < input.length; j++) {
        while (k < input.length && input[i] + input[j] > input[k]) {
          ArrayList<Integer> inner = new ArrayList<Integer>();
          inner.add(input[i]);
          inner.add(input[j]);
          inner.add(input[k]);
          result.add(inner);
          k++;
        }
      }
    }
    return result;
  }

【讨论】:

    【解决方案2】:

    还没有那么理想的作品。我尝试测试上述两种解决方案,但它们似乎不起作用。可能是我错过了一些东西。因此决定在这里发布我测试过的解决方案。它不检查重复项。 求三角形的条件:http://www.wikihow.com/Determine-if-Three-Side-Lengths-Are-a-Triangle

    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Arrays;
    
    class Triangle {
        int a;
        int b;
        int c;
    
        public Triangle(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    
        @Override
        public String toString() {
            return this.a + " " + this.b + " " + this.c;
        }
    }
    
    public class FindTriangle {
    
        public List<Triangle> findTriangle(List<Integer> points) {
            List<Triangle> result = new ArrayList<Triangle>();
            System.out.println("Entered");
    
            for (int i = 0; i < points.size(); i++) {
                int pt0 = points.get(i);
                System.out.println("Entered i:" + i);
    
                for (int j = i + 1; j < points.size() - 2; j++) {
                    int pt1 = points.get(j);
                    int pt2 = points.get(j + 1);
                    Boolean isTri = isTriangle(pt0, pt1, pt2);
                    if (isTri.equals(Boolean.TRUE)) {
                        Triangle t = new Triangle(pt0, pt1, pt2);
                        result.add(t);
                    }
                }
                for (int j = 0; j < (i - 1) && j > 0; j++) {
                    int pt1 = points.get(j);
                    int pt2 = points.get(j + 1);
                    Boolean isTri = isTriangle(pt0, pt1, pt2);
                    if (isTri.equals(Boolean.TRUE)) {
                        Triangle t = new Triangle(pt0, pt1, pt2);
                        result.add(t);
                    }
                }
    
                // final
                int pt1, pt2;
                if (i == 0) {
                    pt1 = points.get(i + 1);
                    pt2 = points.get(points.size() - 1);
                } else if (i == points.size() - 1) {
                    pt1 = points.get(0);
                    pt2 = points.get(i - 1);
                } else {
                    pt1 = points.get(i + 1);
                    pt2 = points.get(i - 1);
                }
    
                Boolean isTri = isTriangle(pt0, pt1, pt2);
                if (isTri.equals(Boolean.TRUE)) {
                    Triangle t = new Triangle(pt0, pt1, pt2);
                    result.add(t);
                }
            }
            return result;
        }
    
        public Boolean isTriangle(Integer pt1, Integer pt2, Integer pt3) {
            System.out.println("Pt1, Pt2, Pt3: " + pt1 + ":" + pt2 + ":" + pt3);
    
            if ((pt1 + pt2) > pt3 && (pt1 + pt3) > pt2 && (pt2 + pt3) > pt1) {
                System.out.println("This is triangle");
                return Boolean.TRUE;
            }
            return Boolean.FALSE;
        }
    
        public ArrayList<ArrayList<Integer>> getTri(int[] input) {
            ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
            if (input.length < 3) {
                return result;
            }
            Arrays.sort(input);
            for (int i = 0; i < input.length - 2; i++) {
                int k = i + 2;
                for (int j = i + 1; j < input.length; j++) {
                    while (k < input.length && input[i] + input[j] > input[k]) {
                        ArrayList<Integer> inner = new ArrayList<Integer>();
                        inner.add(input[i]);
                        inner.add(input[j]);
                        inner.add(input[k]);
                        result.add(inner);
                        k++;
                    }
                }
            }
            return result;
        }
    
        public void findTriangleW(int[] a) {
    
            HashSet<HashSet<Integer>> triangle = new HashSet<HashSet<Integer>>();
            HashSet<Integer> tmp;
            for (int i = 0; i < a.length; i++) {
                int sum = a[i];
                for (int j = 0; j < a.length; j++) {
                    int first = a[j];
                    if (first != sum) {
                        for (int k = 0; k < a.length; k++) {
                            int sec = a[k];
                            if (sec != first && sec != sum && (first + sec < sum)) {
                                tmp = new HashSet<Integer>();
                                tmp.add(first);
                                tmp.add(sec);
                                tmp.add(sum);
                                triangle.add(tmp);
                            }
                        }
                    }
                }
    
            }
    
            for (HashSet<Integer> hs : triangle)
                System.out.println(hs);
        }
    
        public static void main(String[] args) {
            FindTriangle f = new FindTriangle();
            List<Integer> points = new ArrayList<Integer>();
            points.add(1);
            points.add(5);
            points.add(10);
            points.add(7);
    
            System.out.println("Printing final results");
            List<Triangle> result = f.findTriangle(points);
            for (int i = 0; i < result.size(); i++) {
                System.out.println(result.get(i).toString());
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-10-25
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多