如何优化我的代码?我的意思是for循环和if语句javascript
问题: 给定一组鸟类目击事件,其中每个元素代表一个鸟类类型id,确定最常见类型的id。如果发现超过1种类型的ID超过最大数量,请返回它们的最小ID 假设我们有1000个数字,我怎样才能更快地优化我的代码?这对hackerrank来说是一个代码挑战,但我不知道如何优化它如何优化我的代码?我的意思是for循环和if语句javascript,javascript,Javascript,问题: 给定一组鸟类目击事件,其中每个元素代表一个鸟类类型id,确定最常见类型的id。如果发现超过1种类型的ID超过最大数量,请返回它们的最小ID 假设我们有1000个数字,我怎样才能更快地优化我的代码?这对hackerrank来说是一个代码挑战,但我不知道如何优化它 让arr2=[1,2,3,4,5,4,3,2,1,3,4]; 功能迁移鸟类(arr){ 设max=1;//我们从数字1开始,因为它是第一个数字 //进入阵列 让counter=1;//第一个计数器是1,因此我们等于最大值。 le
让arr2=[1,2,3,4,5,4,3,2,1,3,4];
功能迁移鸟类(arr){
设max=1;//我们从数字1开始,因为它是第一个数字
//进入阵列
让counter=1;//第一个计数器是1,因此我们等于最大值。
let type=0;//它是当前最大的数字
arr.sort();//[1,1,2,2,3,3,4,4,5]
//console.log(arr.sort())
让我;
设l=arr.length;
对于(i=0;i计数器){
计数器=最大值;
类型=arr[i];
}
}
返回类型;
};
console.log(migratoryBirds(arr2))代码>这可以在O(n)
中完成。(由于嵌套循环,您当前的方法是O(n^2)
,而.sort
是O(n log n)
)
使用按arr
number索引的对象,其值是找到该值的次数。比如说
[1, 2, 2, 2]
将变成
{
1: 1,
2: 3
}
完成后,通过传递到Math.max
,找到对象值中的最大值,然后迭代条目并找到具有该值的第一个键
在这里使用对象还将有助于满足在存在多个具有最大值的条目时返回最低ID的附带要求。(作为数组标记(如1、2等)的对象键始终以升序数字顺序排列)
让arr2=[1,2,3,4,5,4,3,2,1,3,4];
功能迁移鸟类(arr){
常量obj={};
for(arr的const num){
obj[num]=(obj[num]| | 0)+1;
}
const max=Math.max(…Object.values(obj));
返回号码(
Object.entries(obj)
.find(条目=>条目[1]==最大值)
[0]//从条目中提取密钥
);
};
console.log(migratoryBirds(arr2))
如果可以有许多不同的条目,则单个reduce可能更好,既可以避免在值+条目之间循环两次,也可以避免max参数调用(const max_entry=Object.entries(obj)。reduce((max,entry)=>{return max[1]>=entry[1]?max:entry;},[,-无穷]);return max_entry[0]
非常感谢,这有助于我理解大O符号。也感谢你的更正和评论。@Erick我看到了不可接受的地方,答案有问题吗?@CertainPerformance抱歉,我不知道为什么有人关闭了问题,并给我-1作为基于意见的答案。我不知道为什么。我试图修复它,但我不知道怎么办。