【问题标题】:Java for loop to determine legal trianglesJava for循环确定合法三角形
【发布时间】:2015-08-17 15:40:41
【问题描述】:

如果两个边的和大于第三个,则三个数字形成一个合法三角形。所以 [7,3,6] 和 [8,8,8] 有效,而 [2,6,4] 和 [8,6,1] 无效。我得到一个只有 3 个值的数组。

public boolean isLegalTriangle(double[] lens){
  a = lens[0]
  b = lens[1]
  c = lens[2]

  return ( a+b > c && b+c > a && a+c > b )
}

这是我写的代码。是否可以用for循环重写它? (对索引进行硬编码似乎很原始)

【问题讨论】:

  • 当然有可能......你在哪里卡住了?
  • 为什么您认为您当前的解决方案是原始的?这对我来说似乎是一个完全有效的解决方案,因为 n 既小又固定。
  • 如果给我一个数组,例如 [4,-1,8,2,5,3] 并要求计算使用这些数字可以组成多少合法三角形,那么我需要使用多个循环。所以我正在尝试将我的代码发展到一个新的水平。
  • @BCronyn - 这似乎与您上面提出的要求和问题完全不同
  • 尝试递归它会给出简单的解决方案

标签: java loops for-loop optimization


【解决方案1】:

您可以使用 来实现:

public boolean isLegalTriangle(double[] lens){
    int l = lens.length;
    for (int i = 0 ; i < l; i++) {
        if ( lens[i%l] + lens[(i+1)%l] <= lens[(i+2)%l] ) {
            return false;
        }
    }
    return true;
}

您将进行 3 次迭代:

  • i = 0

    lens[0] + lens[1] <= lens[2]
    
  • i = 1

    lens[1] + lens[2] <= lens[0]
    
  • i = 2

    lens[2] + lens[0] <= lens[1]
    

【讨论】:

  • 你的回答很聪明,它回答了我的直接问题——我不否认。但是,如果给我一个假设为 6 个值的数组,并要求我计算使用这些数字可以制作多少个合法三角形,您上面的代码将只测试 3 个接触值 [i,i+1,i+2]。有没有办法测试所有的值?
  • 那么你需要这样的东西:int count=0; for ( int i = 0 ; ... ) { for ( int j = i+1 ; ... ) { for ( int k = j+1 ; ... ) { if ( isLegalTriangle(lens[i],lens[j],lens[k]) {count++;} }}} System.out.println(count); 其中:public boolean isLegalTriangle(double a, double b, double c){ return ( a+b &gt; c &amp;&amp; b+c &gt; a &amp;&amp; a+c &gt; b ) } 但它可以作为一个不同的问题提出。我们希望我们的解决方案能帮助很多人。而且最好针对不同的问题提出不同的问题。
【解决方案2】:

可以对传入的数组进行排序(使用Array.sort() - 这将对数组进行就地排序),然后比较最大的(第一个)条目与最大的(第一个)条目。第 2/3 个条目的总和,避免在“if”语句中使用多个子句。

不过,上面的内容似乎简洁易读,我一般都赞成。

【讨论】:

    【解决方案3】:

    将这些值相加。如果任何值大于或等于总和的一半,则它不是有效的三角形。

    public boolean isLegalTriangle(double[] lens){
      double max = (lens[0] + len[1] + lens[2]) * 0.5;
    
      return (lens[0] < max) && (lens[1] < max) && (lens[2] < max);
    }
    

    使用 for 循环:

    public boolean isLegalTriangle(double[] lens){
      double max = 0.0;
      for(int i = 0; i < 3; i++)
          max += lens[i];
      max *= 0.5;
    
      for(int i = 0; i < 3; i++)
          if(lens[i] >= max)
              return false;
      return true;
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      相关资源
      最近更新 更多