我做了一些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值用作输出,因此无法真正进行测试。
我的逻辑有问题吗?
答案 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;
}