【问题标题】:How to solve this (http://codingbat.com/prob/p168357) 'codingbat' example efficiently?如何有效地解决这个(http://codingbat.com/prob/p168357)“codingbat”示例?
【发布时间】:2016-11-20 05:58:07
【问题描述】:

我在codingbat.com上遇到了这个问题:Problem

问题:

给定一个整数数组,如果该数组包含两个相邻的 7,或者两个 7 被一个元素隔开,例如 {7, 1, 7},则返回 true。

has77([1, 7, 7]) → 真

has77([1, 7, 1, 7]) → 真

has77([1, 7, 1, 1, 7]) → 假

我解决了它,但我的方法不是那么有效。与问题相比,我的解决方案的代码很大。谁能告诉我如何以聪明的方式解决这个问题。

我的代码:

public boolean has77(int[] nums) {
  int i = 0;
  int arraylength = 0;
  while(i != nums.length){
    if(nums[i] == 7){
      arraylength++;
    }
    i++;
  }
  int[] sevens = new int[arraylength];
  if(arraylength == 0){
    return false;
  }
  i =0;
  int j = 0;
  while(i != nums.length){
    if(nums[i] == 7){
       sevens[j] = i;
       j++;
    }
  i++;
 }
 i = 0;
 while(i != arraylength-1){
     if(sevens[i+1] - sevens[i]==1 || (sevens[i+1]- sevens[i]==2)){
      return true;
 }
i++;
}
 return false;
 }

【问题讨论】:

  • 有效吗?只对数组进行一次迭代。如果当前元素是 7,并且前一个元素或之前的元素也是 7,则返回 true。
  • 在:投反对票的人,最好解释一下投反对票的原因,以便我下次注意。只是一个请求!
  • 我不是反对者,但您不应该只提供链接。链接可能不起作用,因此请始终在您的问题中包含相关部分。您仍然可以提供链接以供完整参考。
  • @Andreas 你能把代码贴出来吗?
  • 不,但我确实转发了我的评论作为答案。

标签: java logic


【解决方案1】:

这个答案会告诉你如何去做,但不会给你代码。编写代码是您的事,因为您选择在 CodingBat 上接受挑战。

更有效的解决方案: 只对数组进行一次迭代。如果当前元素是 7,而前一个元素或前一个元素也是 7,则返回 true

【讨论】:

  • 如果函数参数是数组,你说的逻辑就不行了:[7, 7, 1, 1, 7]
  • 为什么不呢?我试过这样编码,第一次效果很好。
  • public boolean has77(int[] nums) { int i = 0;整数索引七 = 0; while(i != nums.length){ if(nums[i] == 7){ indexseven = i; } 我++; } if(nums[indexseven-1]==7){ return true; } if(nums[indexseven-2]==7){ return true; } 返回假; }
  • indexseven 的目的是什么?摆脱它。 --- 为什么你使用while 循环而不是for 循环来迭代数组? --- 好的,您现在删除了该评论,但您为什么要记录 7 的索引?我的回答在哪里说要这样做?
  • 我终于成功了...感谢您的帮助,我将代码发布为答案。请检查它是否有任何改进...
【解决方案2】:

我终于破解了这个问题。 代码如下:

   public boolean has77(int[] nums) {
      int i = 0;
      while(i != nums.length){
          if(nums[i]==7 && i!=0){
              if(nums[i-1] == 7){
                  return true;
              }
          }
         if(nums[i]==7 && i>1){
             if(nums[i-2] == 7){
                 return true;
             }
         }
         i++;
      }
   return false;
   }

【讨论】:

  • 三个cmets: 1) 如果将if(nums[i]==7 && i>1) 移动到if(nums[i]==7 && i!=0) 中,则不需要检查nums[i]==7 两次。 2) 如果您以i = 1 开头,则不需要i!=0。 3) 为什么要使用while 循环而不是for 循环来迭代数组?
  • 感谢您的评论。好吧,我无缘无故地使用while循环。这不是一个好习惯吗?
  • 对这种循环使用for 循环是更好的做法,因为它将int i = 0i != nums.lengthi++ 保持在一起作为一个单独的结构,即整个循环逻辑在一个地方。它还将i 变量的作用域限定为for 循环。
【解决方案3】:

试试这个:-

public boolean has77(int[] nums) {
  for(int i=0;i<=nums.length-2;i++){
    if(nums[i]==7&&nums[i+1]==7)
    return true;
    for(int j=0;j<nums.length-2;j++){
       if(nums[j]==7&&nums[j+2]==7) 
       return true;
    }
  }
  return false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2023-03-19
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多