当前位置: 首页 > 知识库问答 >
问题:

由于我的黑客等级解决方案超时而终止

漆雕誉
2023-03-14

大家好,请检查问题黑客排名问题陈述

这是我对上述问题的解决方案(链接)

static int migratoryBirds(List<Integer> arr) {
    int ar[]=new int[arr.size()];
    for(int i=0;i<arr.size();i++){
        ar[i] = Collections.frequency(arr,arr.get(i));
        // ar[i] = obj.occuranceOfElement(arr,arr.get(i));
    }
    int maxAt = 0;
    for (int i = 0; i < ar.length; i++) {
        maxAt = ar[i] > ar[maxAt] ? i : maxAt;
    }
    return arr.get(maxAt);
}

当数组大小较大时,我的代码无法处理,例如数组中的17623个元素。

由于超时而终止

问题出在第二个for循环中,该循环遍历数组并给出数组中最大数字的索引。还有其他方法可以提高性能吗。

共有3个答案

黄靖
2023-03-14

这里还有一个:

static int migratoryBirds(List<Integer> arr) {
    int freq[]=new int[6];
    for(int i=0;i<arr.size();i++){
        ++freq[arr.get(i)];
    }
    int maxAt = 1;
    for (int i = 2; i < freq.length; i++) {
        if (freq[i] > freq[maxAt]) {
            maxAt = i;
        }
    }
    return maxAt;
}
周高畅
2023-03-14

你的问题是调用Colletions.frequency,这是一个O(N)操作。当你从循环内部调用它时,它变成了O(N²),这消耗了你所有的时间。

还有,你确定你收到的是哪一份清单?您调用list.get(i ),如果实现是LinkedList,它也可能是O(N)。

本练习的目标是计算输入上一次传递中每个值的频率。您需要一个存储和增加每个值的出现次数的位置,并且需要存储输入的最大值。

您还跳过了规范的关键部分。输入有限制,这使得解决问题比你现在想的要容易。

益银龙
2023-03-14

你的问题在这一部分:

for(int i = 0; i < arr.size(); i++)
    ar[i] = Collections.frequency(arr, arr.get(i));

这是O(N):< code > collections . frequency()遍历整个列表,只计算一个元素的频率。手动地,您可以遍历列表来计算所有元素的频率。

此外,只有5只鸟,所以您只需要5个长度的数组。

static int migratoryBirds(int[] arr) {
    int max = 1;
    int[] freq = new int[6];

    for (int val : arr)
        freq[val]++;

    for (int i = 2; i < freq.length; i++)
        max = freq[i] > freq[max] ? i : max;

    return max;
}
 类似资料:
  • 这段代码在Hackerrank上的一些大输入上显示“Terminated due to timeout”(因超时而终止)错误,但在其余情况下仍能正常工作。请帮助我改进此代码。 约翰·沃森在整数数组上执行一个称为右圆旋转的操作。执行一次右圆旋转操作后,数组将从 转换为 。 Watson多次执行此操作。为了测试Sherlock识别旋转数组中特定位置的当前元素的能力,Watson请求查询,其中每个查询由

  • 输入格式 第一行包含两个空格分隔的整数,分别表示n(整数的个数)和d(您必须执行的左旋转个数)的值。第二行包含n个空格分隔的整数,描述数组初始状态的各个元素。 约束 1<=n<=10^5 1<=d<=n 1<=ai<=10^6 示例输出 当我们执行d=4次左旋转时,数组将经历以下变化顺序: [1,2,3,4,5]-->[2,3,4,5,1]-->[3,4,5,1,2]-->[4,5,1,2]-->

  • 我试图解决hackerrank的一个问题,当我提交我的解决方案时,我得到一个错误,说明“由于超时而终止”。 请检查代码,并建议我如何优化。 语句:您有一个空序列,将向您提供查询。每个查询都是以下三种类型之一: 1 x-将元素x推入堆栈。2-删除堆栈顶部的元素。3-打印堆栈中的最大元素。 输入格式 输入的第一行包含一个整数。接下来的每一行都包含上述查询。(保证每个查询都是有效的。) 输出格式 对于每

  • 问题是-合并两个排序的链表。有关详细信息,请访问https://www.hackerrank.com/challenges/merge-two-sorted-linked-lists当我在网站上提交此内容时,它显示“因超时而终止”。请告诉我代码有什么问题,以及如何修复它。 }

  • 问题内容: 我有两个加载同一个类的ClassLoader。因此,显然这些不能互相投射。但是我需要访问在其他ClassLoader中创建的对象。 我可以访问两个ClassLoader。如何在其他课程中使用该对象?我不需要强制转换对象以匹配当前的ClassLoader。 但是问题在于返回的对象的类型为。因此,我必须放弃该对象才能访问某些方法。我怎样才能做到这一点?像下面这样的普通类型转换会导致Clas

  • 关于这个话题有很多讨论。我看了一遍,但没有一个有用。 问题似乎相当简单: 如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。 求N以下3或5的所有倍数之和。 输入格式第一行包含表示测试用例数量的T。接下来是T行,每一行包含一个整数N。 输出格式对于每个测试用例,打印一个整数,表示N以下3或5的所有倍数之和。 约束1≤T≤10^5 1≤N≤10^9 然