我正试图解决 CodeWars.com
上的编码挑战,我希望能在正确的方向上得到一点插入。下面的函数应该接受一串数字(如 "2 4 7 8 10"
或 "1 2 2"
等)并输出均匀度(偶数或奇数)与其他数字不同的数字。 CodeWars.com
链接位于:https://www.codewars.com/kata/iq-test/train/javascript )
我的功能似乎在最后一个数字是不同数字(“100 100 1”
或 “5 3 2”
)的测试中失败。为什么我的功能以这种方式执行的任何想法?我一直在看它,但我不明白为什么它会这样做:
function iqTest(numbers){
let numArr = numbers.split(' ');
let obj = {};
obj.evenCount = 0;
obj.oddCount = 0;
console.log(numArr);
for (let i = 0; i < numArr.length; i++) {
if (numArr[i] % 2 === 0) {
obj.evenCount += 1;
obj.even = i + 1;
} else {
obj.oddCount += 1;
obj.odd = i + 1;
}
}
if (obj.even < obj.odd) {
return (obj.even);
} else {
return (obj.odd);
}
}
console.log(iqTest('5 3 2'));
最佳答案
您需要在函数末尾检查 eventCount
和 oddCount
,而不是 odd
和 event
像这样的属性:
if (obj.evenCount < obj.oddCount) {
之前,您是在检查哪个索引更高(即位置),但实际上您想检查哪个计数/频率更高。
请参阅下面的工作示例:
function iqTest(numbers) {
let numArr = numbers.split(' ');
let obj = {};
obj.evenCount = 0;
obj.oddCount = 0;
console.log(numArr);
for (let i = 0; i < numArr.length; i++) {
if (numArr[i] % 2 === 0) {
obj.evenCount += 1;
obj.even = i + 1;
} else {
obj.oddCount += 1;
obj.odd = i + 1;
}
if(obj.oddCount > 0 && obj.evenCount > 0 && obj.oddCount !== obj.evenCount) { // early termination condition
break; // break out of the loop is the difference between odd and even already exists
}
}
if (obj.evenCount < obj.oddCount) { // change to check the counts
return (obj.even);
} else {
return (obj.odd);
}
}
console.log(iqTest("2 4 7 8 10")); // 3 (item: 7)
console.log(iqTest("1 2 2")); // 1 (item: 1)
console.log(iqTest("100 100 1")); // 3 (item: 1)
console.log(iqTest("5 3 2")); // 3 (item: 2)
关于javascript - 查找离群值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54546095/