【问题标题】:Java program to find the duplicate values of an array of integer using simple loopJava程序使用简单循环查找整数数组的重复值
【发布时间】:2018-03-16 00:00:26
【问题描述】:
public class ArrayTest{

    public static void main(String[] args) {

        int array[] = {32,3,3,4,5,6,88,98,9,9,9,9,9,9,1,2,3,4,5,6,4,3,7,7,8,8,88,88};

        for(int i= 0;i<array.length-1;i++){
            for(int j=i+1;j<array.length;j++){
                if((array[i])==(array[j]) && (i != j)){
                    System.out.println("element occuring twice are:" + array[j]);
                }
            }
        }
    }
}

这个程序工作正常,但是当我编译它时,它会一次又一次地打印值或更多它只是打印 5...等等....这是我想要做的。但是这个程序的行为不是那样的,所以我在这里缺少什么。

您的帮助将不胜感激。 问候!

【问题讨论】:

  • 阅读“break”声明。
  • 我认为即使是“休息”也无济于事。 OP 必须记住所有以前的重复项,这将超出“简单循环”imo。不过,它可以通过地图实现。
  • 为什么你认为你的代码应该做你想做的事?您的代码有什么具体问题?正如目前所写的那样,您的问题要求有人为您编写代码并且不属于 SO。
  • 如果你只能使用循环:当你发现一个你认为是重复的值时,从 0 循环到i-1,检查它是否包含与array[i] 相同的值。如果是,则您已经打印了该号码,因此您无需再次打印。

标签: java arrays for-loop


【解决方案1】:

对数组进行排序,以便将所有相似的值放在一起。

public class ArrayTest{
    public static void main(String[] args) {
        int array[] = {32,3,3,4,5,6,88,98,9,9,9,9,9,9,1,2,3,4,5,6,4,3,7,7,8,8,88,88};
        Arrays.sort(array);
        for (int a = 0; a < array.length-1; a++) {
            boolean duplicate = false;
            while (array[a+1] == array[a]) {
                a++;
                duplicate = true;
            }
            if (duplicate) System.out.println("Duplicate is " + array[a]);
        }
    }
}

【讨论】:

    【解决方案2】:

    问题陈述不清楚,但假设您无法排序(否则问题会大大简化)。我们还假设空间复杂度受到限制,并且您不能保留地图等来计算频率。

    你可以使用lookbehind,但这会不必要地增加时间复杂度。

    我认为一个合理的做法是保留值 -1 来表示已经处理了一个数组位置。在处理数组时,将每个活动值更新为 -1。例如,如果第一个元素是 32,那么您扫描数组中的任何值 32,并替换为 -1。时间复杂度不超过O(n^2)。

    这留下了 -1 是实际值的 awkcase 情况。需要在主代码之前对 -1 进行 O(n) 扫描。

    如果必须保留数组,则在处理之前对其进行克隆。 O(n^2) 循环是:

    for (int i = 0; i < array.length - 1; i++) {
        boolean multiple = false;
        for (int j = i + 1; j < array.length && array[i] != -1; j++) {
            if (array[i] == array[j]) {
                multiple = true;
                array[j] = -1;
            }
        }
        if (multiple)
            System.out.println("element occuring multiple times is:" + array[i]);
    }
    

    【讨论】:

      【解决方案3】:

      你可以做的是使用一个只包含唯一值的数据结构,Set。在这种情况下,我们使用 HashSet 来存储所有重复项。然后检查 Set 是否包含索引 i 处的值,如果不包含,则循环遍历数组以尝试查找重复项。如果 Set 已经包含该数字,我们知道它之前已经找到,我们跳过第二个 for 循环。

      int array[] = {32,3,3,4,5,6,88,98,9,9,9,9,9,9,1,2,3,4,5,6,4,3,7,7,8,8,88,88};
      HashSet<Integer> duplicates = new HashSet<>();
      for(int i= 0;i<array.length-1;i++)
      {
          if(!duplicates.contains(array[i]))
              for(int j=i+1;j<array.length;j++)
              {
                  if((array[i])==(array[j]) && (i != j)){
                      duplicates.add(array[i]);
                          break;
                  }
              }
      }
      System.out.println(duplicates.toString());
      

      输出

      [3, 4, 5, 6, 7, 88, 8, 9]
      

      【讨论】:

        【解决方案4】:

        我建议使用Map 来确定值是否重复。 多次出现的值将被视为重复值。

        附:对于重复项,使用set 抽象数据类型将是理想的(HashSet 将是 ADT 的实现),因为查找时间是 O(1),因为它使用散列算法将值映射到数组索引。我在这里使用地图,因为我们已经有了使用set 的解决方案。本质上,除了使用的数据结构外,逻辑几乎相同。

        有关地图数据结构的更多信息,请点击here

        您可以只编写两个 for 循环,而不是编写嵌套循环,从而得到具有线性时间复杂度的解决方案。

        public void printDuplicates(int[] array) {
            Map<Integer, Integer> numberMap = new HashMap<>();
            // Loop through array and mark occurring items
            for (int i : array) {
                // If key exists, it is a duplicate
                if (numberMap.containsKey(i)) {
                    numberMap.put(i, numberMap.get(i) + 1);
                } else {
                    numberMap.put(i, 1);
                }
            }
        
            for (Integer key : numberMap.keySet()) {
                // anything with more than one occurrence is a duplicate
                if (numberMap.get(key) > 1) {
                    System.out.println(key + " is a reoccurring number that occurs " + numberMap.get(key) + " times");
                }
            }
        }
        

        假设代码被添加到ArrayTest类,你可以这样。

        public class ArrayTest {
            public static void main(String[] args) {
                int array[] = {32,3,3,4,5,6,88,98,9,9,9,9,9,9,1,2,3,4,5,6,4,3,7,7,8,8,88,88};
                ArrayTest test = new ArrayTest();
                test.printDuplicates(array);
            }
        }
        

        如果您想更改上面的代码以查找恰好重复出现两次(不超过一次)的数字,您可以更改以下代码

        if (numberMap.get(key) &gt; 1)if (numberMap.get(key) == 2)

        注意:此解决方案占用 O(n) 内存,因此如果内存是一个问题,Ian 的上述解决方案将是正确的方法(使用嵌套循环)。

        【讨论】:

          【解决方案5】:

          对数组进行排序。查看前面的一个,看看它是否重复。还要看看后面的一个,看看这是否已经算作重复了(除了 i == 0 时,不要回头)。

          import java.util.Arrays;
          
          public class ArrayTest{
          
              public static void main(String[] args) {
          
                  int array[] = {32,32,3,3,4,5,6,88,98,9,9,9,9,9,9,1,2,3,4,5,6,4,3,7,7,8,8,88,88};
          
                  Arrays.sort(array);
                  for(int i= 0;i<array.length-1;i++){
                      if((array[i])==(array[i+1]) && (i == 0 || (array[i]) != (array[i-1]))){
                          System.out.println("element occuring twice are:" + array[i]);
                      }
                  }
              }
          }
          

          打印:

          element occuring twice are:3
          element occuring twice are:4
          element occuring twice are:5
          element occuring twice are:6
          element occuring twice are:7
          element occuring twice are:8
          element occuring twice are:9
          element occuring twice are:32
          element occuring twice are:88
          

          【讨论】:

            猜你喜欢
            • 2021-03-25
            • 2014-05-20
            • 2011-10-31
            • 1970-01-01
            • 2015-12-04
            • 2015-01-17
            • 1970-01-01
            • 2016-02-17
            相关资源
            最近更新 更多