仅对大数据查找阵列中最大数目的总数失败

时间:2018-08-29 05:37:51

标签: javascript arrays node.js

我做了一些Hackerrank挑战来提高我的问题解决能力,所以挑战之一就是要从一组数字中找到最大总数。例如,如果我们有3 2 1 3 1 3,则应返回3

这就是我所做的:

function birthdayCakeCandles(ar) {
let total= 0
let sortedArray = ar.sort((cur,next)=>{
    return cur<next
})

ar.map(item => {
    if(item===sortedArray[0]) {
        total ++;
    }
    })
return total
}

因此,我对给定的数组进行了排序,然后遍历该数组,并检查有多少个数字等于该数组中的最大数字并计算总数。

这将通过8/9个测试用例(其中一个测试用例),其数组的长度为100000,对此失败,this是该测试用例的给定数据。

真的不知道为什么它在本次测试中失败,这是否可能是因为JavaScript始终是同步的和单线程的?

我尝试使用Promise和async等待,但是hackerrank会将第一个返回作为输出(这是Promise本身),并且不将resolve值用作输出,因此无法真正进行测试。

我的逻辑有问题吗?

2 个答案:

答案 0 :(得分:4)

排序方法太慢(O(n log n)时间复杂度)。对于人力资源方面的算法挑战,不太可能是某些语言选择所特有的功能(例如promise / async)会抢救您。

您可以使用一个对象一次完成此操作,以跟踪您“看到”了每个数字多少次和数组的最大数量,然后只需索引到该对象即可得到答案:

function birthdayCakeCandles(ar) {
    let best = -Infinity;
    const seen = {};

    for (let i = 0; i < ar.length; i++) {
        if (ar[i] > best) {
            best = ar[i];
        }

        seen[ar[i]] = ++seen[ar[i]] || 1;
    }

    return seen[best];
}

时间和空间复杂度:O(n)。

编辑:

This answer更好,它具有恒定的空间(在JS中是这样的):

function birthdayCakeCandles(ar) {
    let best = -Infinity;
    let count = 0;

    for (const n of ar) {
        if (n > best) {
            best = n;
            count = 1;
        }
        else if (n === best) {
            count++;
        }
    }

    return count;
}

答案 1 :(得分:2)

在您的情况下,内置函数sort正在大量使用资源。也许这就是它因时空复杂性而失败的原因。

顺便说一句,可以使用for循环轻松解决此问题。这个想法是

伪代码

var maxNum = -999999; // put here the highest limit of int or what ever data type 
int count = 0;
for(x in arr)
{
  if (x > maxNum)
  {
     maxNum = x;
     count = 1;
  }

  if(x==maxNum) count ++;
}

此处count将作为输出。

完整代码是

function birthdayCakeCandles(ar) {
  var maxNum = -1;
  var count = 0;

   for(var i=0; i< ar.length; i++){
       var x = ar[i];

       if(x<maxNum) continue;

       if(x>maxNum){
           maxNum = x;
           count = 1;
       }       
       else{
        count++;
       }       
   }
return count;
}