【问题标题】:How to check if all duplicates in an array are grouped如何检查数组中的所有重复项是否已分组
【发布时间】:2017-09-10 06:17:55
【问题描述】:

我想检查一个数组或列表中所有相似的整数是否被分组。 {2, 2, 5, 5, 5, 1, 7, 7, 5, 7} 应该给 false。而{2, 2, 5, 5, 5, 1, 7, 7, 7} 应该给true。这就是我目前所拥有的,当它应该是false时它会打印true

public class testing1 {

  public static void main(String[] args){
    int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
    System.out.println(isGrouped(x));

  }

  public static boolean isGrouped(int[] x){
    for(int i = 0; i < x.length; i++){
      for(int j = i + 1; j < x.length; j++){
        if(x[i] == x[j]) 
          return true;
      }
    }
    return false;
  }
}

【问题讨论】:

  • 你的代码打印什么
  • 你需要检查一组数字
  • @NavneetKrishna 当它应该为假时它打印为真
  • 你们有没有读过他的问题?它很清楚,很常见。
  • 只要找到每个重复值的出现次数。然后,您必须检查循环内部,以便所有出现的事件都被分组。

标签: java arrays list duplicates grouping


【解决方案1】:

您的答案,正如其他答案中提到的那样,并未处理所有情况,因此不适用于许多情况。此外,这里不需要 2 个循环。您可以将已经看到的元素存储在散列中,并且对于列表中的每个元素(无论它是否第一次出现)。如果不是第一次出现,并且前一个元素和这个不一样,那么它应该是假的。

代码如下:

public class testing1 {

  public static void main(String[] args){
    int [] x = {2, 2, 5, 5, 5, 1, 7, 7, 5, 7};
    System.out.println(isGrouped(x));
  }

  public static boolean isGrouped(int[] x){

      int prev = x[0] ;

    Hashtable<Integer, Integer> hashtable = 
              new Hashtable<Integer, Integer>();
    hashtable.put(x[0], 0);
    for (int i = 1 ; i < x.length ; i ++)
    {
        if (hashtable.get(x[i]) != null && prev == x[i]){
            hashtable.put(x[i], hashtable.get(x[i]) + 1);
        }

        else if (hashtable.get(x[i]) != null && prev != x[i]){
            return false;
        }

        else{
            hashtable.put(x[i], 0);
        }
        prev = x[i];
    }
    return true ;
    }

}

这也存储了每个元素出现次数的计数。 希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    您目前得到的输出不正确

    for(int i = 0; i < x.length; i++){
      for(int j = i + 1; j < x.length; j++){
        if(x[i] == x[j]) 
          return true;
      }
    }
    

    返回true,只要找到连续出现的任何数字(在您的情况下为 2,2)。请注意,这将退出循环并且控制到达调用您的isGrouped 方法的打印语句,它将打印true

    实际上,简而言之,除非列表中的所有数字都不同,否则在这种情况下您不会遍历完整列表。

    否则,您应该维护一个已遍历元素的列表或为每个遍历一次的元素设置一个标志为 true。此外,您不需要在那里嵌套循环。

    【讨论】:

      【解决方案3】:

      这里是如何实现算法的提示。

      1. 您需要一个循环遍历数组的所有元素/索引
      2. 对于每个元素,您必须测试该元素是否允许出现在该索引处。

      那么,什么时候允许元素存在呢?

      1. 如果它是数组的第一个元素,则允许它在那里
      2. 如果等于前一个元素,则允许存在
      3. 如果它与前一个元素不同,并且是第一次在数组中遇到此值,则允许存在
      4. 否则不允许出现。

      【讨论】:

        【解决方案4】:

        您的代码不起作用,因为一旦找到两个相等的相邻值,它就会返回 true。

        一种解决方案是:

        • 从输入数组中删除连续重复项
        • 从输入数组中删除 所有 个重复项(转换为 set,然后再次转换为数组)
        • 比较结果 - 如果两者相等,则返回 true,否则返回 false

        创建没有连续重复的新数组:

        for (int i = 1; i < x.length; i++) {
            if (x[i-1] != x[i]) {
                newArr.add(x[i]);
            }
        }
        

        现在您删除所有重复项:

        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < x.length; i++){
            set.add(x[i]);
        }
        // create array from the set
        

        并比较两者。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-09
          • 2018-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-14
          相关资源
          最近更新 更多