【问题标题】:How Can I Get This List to Print Repeated Values in an Array Without Printing the Value Twice如何获取此列表以打印数组中的重复值而不打印两次值
【发布时间】:2020-04-29 23:26:20
【问题描述】:
 public static void printOrganizedList(int[] array) {
    int[] temp = array;
    System.out.println("N        Count");

    for(int i = 0; i < array.length; i++) {
        int count = 0;

        for (int j = 0; j < array.length; j++) {
            if(array[i] == array[j]) {
                count++;
            }
        }
        for(int n = i-1; n > 0; n--) {
            if(array[n] == array[i]) {
                break;
            }
            else {
                System.out.println(array[i] + "        " + count);
            }
        }
    }
}

此方法用于接收一个数组并打印重复值以及它在数组中出现的次数。像这样:

     -12, 3, -12, 4, 1, 1, -12, 1, 1, 2, 3, 4, 2, 3, -12

    The program output should be:

    N        Count

    4               2

    3               3

    2               2

    1               4

    -1             1

    -12          4

我的问题是,无论我尝试什么,该方法总是吐出重复的数字及其重复次数,重复次数与重复次数一样多。所以不是输出

    "-12        4"

它会输出:

    "-12        4"
    "-12        4"
    "-12        4"
    "-12        4"

我也知道有更先进和更有效的技术,但我们还没有学到很多东西。 提前致谢。

【问题讨论】:

  • 是否允许使用 HashMap 来存储输入数组中数字的计数/频率?
  • 我们可以使用我相信的任何东西,但我无法向他证明我使用哈希图的合理性,因为我们还没有这样做。

标签: java arrays loops


【解决方案1】:

这可以使用 HashMap 轻松实现。您可以创建一个 Hashmap,将元素保存为键,并将出现次数保存为值。

public static void printOrganizedList(int[] array) {
    System.out.println("N        Count");

    HashMap<Integer, Integer> countMap = new HashMap<>();

    for (int i = 0; i < array.length; i++){

        if (countMap.containsKey(array[i])){
            int count = countMap.get(array[i]);
            countMap.replace(array[i], count + 1);
        }else{
            countMap.put(array[i], 1);
        }
    }

    Iterator iterator = countMap.entrySet().iterator();
    while (iterator.hasNext()){
        Map.Entry mapElement = (Map.Entry) iterator.next();
        int key = (int) mapElement.getKey();
        int count = (int) mapElement.getValue();
        System.out.println(key + "        " + count);
    }
}

此外,您编写的程序的时间复杂度达到 O(N^2),这对于大型程序来说可能是一个非常大的瓶颈。

上面的带有 hashmap 实现的程序只会花费你 O(N)

【讨论】:

    【解决方案2】:

    如果输入数组的范围是合理的(例如,从-12到12,而不是从Integer.MIN_VALUE到Long.MAX_VALUE),你可以应用计数排序:

    • 在数组中定义最小值和最大值,
    • 计算频率,
    • 并打印出频率大于1的数字:
    int min = arr[0], max = arr[0];
    for (int i = 1; i < arr.length; i++) {
       if (arr[i] < min) min = arr[i];
       else if (arr[i] > max) max = arr[i];
    }
    int[] freq = new int[max - min + 1];
    for (int i = 0; i < arr.length; i++) {
       freq[min + i]++;
    }
    for (int i = 0; i < freq.length; i++) {
        if (freq[min + i] > 1) {
            System.out.println((min + i) + "  " + freq[min + i]);
        }
    }
    

    【讨论】:

      【解决方案3】:
          public static void main(String[] args) {
              printOrganizedList(new int[] { -12, 3, -12, 4, 1, 1, -12, 1, 1, 2, 3, 4, 2, 3, -12 });
          }
      
          public static void printOrganizedList(int[] array) {
              System.out.println("N\tCount");
              Map<Integer, Integer> freq = new TreeMap<>();
              for (int i = 0; i < array.length; i++) {
                  if (freq.containsKey(Integer.valueOf(array[i])))
                      freq.put(Integer.valueOf(array[i]), freq.get(Integer.valueOf(array[i])) + 1);
                  else
                      freq.put(Integer.valueOf(array[i]), 1);
              }
      
              for (Integer key : freq.keySet()) {
                  System.out.println(key + "\t" + freq.get(key));
              }
          }
      

      ,输出

      N       Count
      -12     4
      1       4
      2       2
      3       3
      4       2
      

      ,另一种匹配您的代码的解决方案

          public static void printOrganizedList(int[] array) {
              System.out.println("N\tCount");
              Arrays.sort(array);
              for (int i = 0; i < array.length; i++) {
                  int count = 0;
      
                  // calc freq
                  for (int j = 0; j < array.length; j++) {
                      if (array[i] == array[j])
                          count++;
                  }
                  if (count > 1)
                      System.out.println(array[i] + "\t" + count);
                  i += count;
              }
          }
      

      【讨论】:

      • 嵌套循环可能会改进:for (int j = i; j &lt; array.length; j++) { if (array[i] != array[j]) break; count++;}
      • 我对计算频率部分有疑问。每当我只输入一次数字时,它将完全忽略该数字。因此,如果我输入 {1, 8 , 1, 8, 4} 它将准确打印 1 和 8 但根本不会打印 4,我该如何解决这个问题?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2014-08-05
      • 2020-04-23
      相关资源
      最近更新 更多