【问题标题】:Remove each element that occrus more than 'N' times problem删除出现超过 'N' 次问题的每个元素
【发布时间】:2020-12-18 17:51:14
【问题描述】:

我的代码中有一个小错误,希望您能帮助我!

我有一个 ArrayList,我想删除所有重复超过 'N' 次的元素。我的解决方案在大多数情况下都可以正常工作,但是当涉及到 N=1 并且 ArrayList 大小超过 30 左右时,它会跳过一个元素,因此它不是唯一的。它的索引是随机的(我的意思是我试图找到一个隐藏问题的特殊索引,但我找不到)。

代码来了

while(isSorted!=true) {
for (int i = 0; i < test.size(); i++) {
    counter = 0;
    temp = test.get(i);
    for (int j = i + 1; j < test.size(); j++) {
        if (temp == test.get(j)) {
            counter++;
            if (counter >= maxOccurrences) {
                test.remove(j);
               }
            }
          }
        if(counter<maxOccurrences){
           isSorted=true;
       }
    }
 }

如果我再次重复这段代码,它会删除这个元素,一切都很好。我试图理解为什么它会跳过一个不唯一的元素。我可以将 HashSet 用于这种特殊情况(当 N=1 时),但感觉有点作弊。 我希望我的问题很清楚,并提供了所有需要的信息。 先感谢您。和平与爱!

【问题讨论】:

  • 您能否提供您观察到奇怪行为的数据的示例输入?
  • 来了! ArrayList 是:{58, 14, 9, 1, 31, 36, 54, 41, 13, 14, 1, 20, 26, 35, 10, 25, 31, 63, 62, 32, 30, 40, 71, 31, 38, 44, 31, 29, 8, 34, 14, 43, 54, 76, 62, 58, 60, 33, 12, 54, 4, 38, 6, 40, 8, 68, 39, 41, 57, 58, 13, 46, 37, 70, 23, 75, 13, 17, 28, 44, 44, 67, 3, 19, 0, 15, 24, 55, 49, 51, 44, 2, 51, 19, 40, 1, 76};结果是: [58, 14, 9, 1, 31, 36, 54, 41, 13, 20, 26, 35, 10, 25, 63, 62, 32, 30, 40, 71, 38, ?? ??????, 29, 8, 34, 43, 76, 60, 33, 12, 4, 6, 68, 39, 57, 46, 37, 70, 23, 75, 17, 28, ??? ?????, 67, 3, 19, 0, 15, 24, 55, 49, 51, 2] 如您所见,44 还剩 2 次!

标签: java loops sorting arraylist


【解决方案1】:

在迭代列表时弄乱它可能会危害您的健康。我怀疑您的基于索引的循环被调用 remove 所愚弄,这会导致移位。

您的算法大约是 N^3。如果允许,请考虑先对数组进行排序,或者按照另一位受访者的建议,通过一次计算所有数组元素来使用额外的存储空间来减少搜索时间。

【讨论】:

    【解决方案2】:

    在我看来,使用 HashSet 在渐近方面会更好,因为它不会超过求和规则的 O(n)。

    Map<Integer, Integer> newMap = new HashMap<>();
            integers.forEach(integer -> {
                if(newMap.containsKey(integer) && integer != null)
                    newMap.put(integer, newMap.get(integer) + 1);
                else
                    newMap.put(integer, 1);
            });
        return newMap.entrySet()
                    .stream()
                    .filter(x->x.getValue().equals(numberOfDuplicates))
                    .map(x->x.getKey())
                    .collect(Collectors.toList())
    

    你的代码最好使用equals()而不是==,因为如果数字大于127且小于-127,你的代码将永远无法正常工作。

    问题是remove,你需要将j减1,因为如果元素连续出现,下一个元素会移动到过去j,你不会删除它,因为你已经在 j+1 元素上

    if (counter >= maxOccurrences) {
         test.remove(j);
         j--;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      相关资源
      最近更新 更多