Java 如何输出一个新数组,其中包含前一个数组中最多出现k次的所有数字

Java 如何输出一个新数组,其中包含前一个数组中最多出现k次的所有数字,java,arrays,algorithm,Java,Arrays,Algorithm,如何创建一个新数组,其中包含java中最多出现k次的所有数组数 例如,如果数组为: {1,4,4,3,4,3,5,2,5,1,5} 和k=2,新阵列将是: {1,3,2}. 我假设我需要比较数组中的元素,并添加存储它作为变量出现的次数。然后我将该变量与k进行比较,如果它小于或等于它,它将把它添加到一个新的arraylist中。我真的不能实现这个想法。 谢谢根据您的限制条件,有很多方法可以做到这一点 如果您不需要担心内存限制,那么可以通过使用从数组元素映射到其频率的HashMap轻松解决此问题

如何创建一个新数组,其中包含java中最多出现k次的所有数组数

例如,如果数组为:

{1,4,4,3,4,3,5,2,5,1,5}
k=2
,新阵列将是:

{1,3,2}.
我假设我需要比较数组中的元素,并添加存储它作为变量出现的次数。然后我将该变量与
k
进行比较,如果它小于或等于它,它将把它添加到一个新的arraylist中。我真的不能实现这个想法。
谢谢

根据您的限制条件,有很多方法可以做到这一点

如果您不需要担心内存限制,那么可以通过使用从数组元素映射到其频率的
HashMap
轻松解决此问题。该算法通过扫描整个阵列来工作。对于每个元素,如果该元素已经在
HashMap
中,则更新
HashMap
中的键/值对以增加该元素的频率。否则,如果未看到元素,则将频率更新为1。填充完
HashMap
后,您可以遍历映射并将频率最多为
k
的所有元素复制到新的
ArrayList
。例如:

for(Map.Entry<T, Integer> entry: myMap.entrySet()) {
    if (entry.getValue() <= k)
        myArrayList.add(entry.getKey());
}
从这里可以更容易地确定每个元素有多少个副本。您可以通过遍历阵列来实现这一点,跟踪当前正在查找的元素以及有多少副本。每当看到新元素时,如果它与当前元素匹配,则递增计数器。如果不是,则将要检查的元素重置为新元素,并将计数器设置回1。例如,对于上面的数组,您可以从查看以下元素开始:

1 1 2 3 3 4 4 4 5 5 5
^

Element: 1
Frequency: 1
现在,看看数组的下一个元素。因为它是1,所以将频率计数增加到2:

1 1 2 3 3 4 4 4 5 5 5
  ^

Element: 1
Frequency: 2
当您查看下一个元素时,您将看到它是2。这意味着不再剩下1了。因为1有两个副本,所以可以将1追加到结果数组中。然后将计数器重置为1,保持此状态:

1 1 2 3 3 4 4 4 5 5 5
    ^

Element: 2
Frequency: 1
执行此操作时要注意的一件事是记住处理访问最终数组元素的情况。重要的是,当您到达数组末尾时,如果您最多有最后一个元素的
k
个副本,请将最后一个数字添加到输出数组中

每当执行此操作时,如果发现一个元素最多出现
k次
,则可以将其添加到新数组中。第二步在O(n)时间和O(m)空间中运行(其中m是结果数组中的元素总数),因此总复杂度是O(n logn)时间和O(m+logn)空间


希望这有帮助

您至少有两种方法:

  • 线性扫描数组,更新哈希表,该哈希表存储每个遇到数字的频率(平均时间:O(n),空间:O(n))
  • 对数组进行排序,并记录您看到当前元素的次数(每次当前数字与前一个不同时,将设置为1)。时间:O(n lg n),空间:O(m),其中m是返回元素的数量(假设使用O(1)空间复杂性分类器,如heapsort)

  • 第一个是时间最优,第二个是空间最优。

    频率表的定制问题!!这是家庭作业吗?如果是这样就可以了,但是它应该有
    家庭作业
    标签。+1以确保完整性,而不是为他完成整个家庭作业:)第二种方法是O(logn+m)空间,其中m是输出大小。第一种解决方案(map-one)不会在O(n)时间内运行,因为HashMap中有单独的链接,复杂性变为O(n^2)@Suraj Chandran-虽然您正确地认为在最坏的情况下运行时是O(n^2),但在平均情况下,行为应该是O(n),因为
    HashMap
    内部试图保持平衡的负载因子。@akappa-哎呀,我的错误!我已更新我的答案以更正此问题。
    1 1 2 3 3 4 4 4 5 5 5
        ^
    
    Element: 2
    Frequency: 1