我应该返回给定数组的平均值和模式。但是对于模式,如果有两种模式,那么我需要返回数组中的第一种模式。例如,如果数组为statsFinder(500,400,400,375,300,350,325,300),则输出应为: 368.75,400,因为400发生在300之前的数组中。虽然我相信我接近解决方案,但我无法得到第一次出现的模式。有人知道我如何修正我的代码以获得第一次出现的模式吗?这是我的解决方案:
function statsFinder(array) {
let length=array.length
let sum=array.reduce((acc,curr)=>{
return acc+curr
})
let mean=sum/length
let obj=array.reduce((acc,curr)=>{
acc[curr]=acc[curr] ? acc[curr]+1:1
if(acc[curr]>acc.max){
acc.max=acc[curr]
}
return acc
},{max:1})
let mode=0
for(let key in obj){
if (mode[key]===mode.max){
mode=parseInt(key)
}
return [mean, mode]
}
}发布于 2022-04-19 18:10:13
你所做的:
虽然你应该在第二次扫描中修复缩进,这样你就可以知道为什么它不能工作了。你想要这个
for(let key in obj){
if (mode[key]===mode.max){
mode=parseInt(key)
return [mean, mode]
}
}或者,更好的是:
for(let key in obj){
if (mode[key]===mode.max){
mode=parseInt(key)
break
}
}
return [mean, mode]请注意,依赖Javascript对象中属性的迭代顺序并不是最佳实践,尽管它可能“大部分时间”都能工作。如果需要按插入顺序迭代,则应该使用Map (如果可能的话)。
但整个扫描都是愚蠢的。在计算频率时,您只需记住与最大计数相关的值:
acc[curr] = acc[curr] ? acc[curr]+1 : 1
if (acc[curr] > acc.max) {
acc.maxval = curr
acc.max = acc[curr]
}然后您就知道了模式,而不需要再次搜索它,而且您也不需要将值转换回数字。
发布于 2022-08-24 20:52:56
刚遇到同样的挑战,到目前为止,这是我的代码,希望它能帮助你。它只是通过了3/5的测试,所以仍有改进的余地。
function statsFinder(array) {
// Write your code here
let sum = array.reduce((partialSum, a) => partialSum + a, 0);
const mean = sum / array.length;
let answer = [mean];
for(let i=0; i<array.length;i++) {
let current = array[0];
if(current === array[1]) {
answer.push(current);
break;
} else {
array.shift();
}
}
return answer;
}
console.log(statsFinder([500, 400, 400, 375, 300, 350, 325, 300]))
https://stackoverflow.com/questions/71929223
复制相似问题