您将获得一个包含整数的数组(其长度至少为3,但可能非常大)。除了单个整数N之外,数组中的整数要么完全是奇数,要么完全是偶数。编写一个将数组作为参数并返回N的方法。
例如: [2,4,0,100,4,11,2602,36] 应该返回:11
我需要工作的测试用例:
Test.assertEquals(findOutlier([0, 1, 2]), 1)
Test.assertEquals(findOutlier([1, 2, 3]), 2)
Test.assertEquals(findOutlier([2,6,8,10,3]), 3)
Test.assertEquals(findOutlier([0,0,3,0,0]), 3)
Test.assertEquals(findOutlier([1,1,0,1,1]), 0)
到目前为止,我的代码似乎无法运行:
function findOutlier(integers){
var evens = [];
var odds = [];
for (var i = 0; i < integers.length; i++) {
if (integers[i] % 2) {
evens.push(integers[i]);
} else {
odds.push(integers[i]);
}
}
var elen = evens.length;
var olen = odds.length
if (elen > olen) {
return odds;
} else {
return evens;
}
}
请使用此代码更改哪些内容?
答案 0 :(得分:1)
首先,你的情况应该是:
if (integers[i] % 2 === 0) {
你需要返回数组的第一个元素:
return odds[0];
这是我如何接近它:
function findOutlier(arr) {
var result = arr.reduce(function(p, c) {
p[c % 2 === 0 ? 'even' : 'odd'].push(c);
return p;
}, { odd: [], even: [] });
var eLen = result.even.length;
var oLen = result.odd.length;
if (oLen < eLen) {
return oLen > 1 ? result.odd : result.odd[0];
} else {
return eLen > 1 ? result.even : result.even[0];
};
}
答案 1 :(得分:1)
我看到2个可能的修改: 1)返回数组中的单个值而不是所有数组
return evens[0];
更改你的if以检查modulo == 0(如果余数= 0则是偶数)
if ((integers[i] % 2) == 0)
-
function findOutlier(integers){
var evens = [];
var odds = [];
for (var i = 0; i < integers.length; i++)
{
if ((integers[i] % 2) == 0)
{
evens.push(integers[i]);
}
else
{
odds.push(integers[i]);
}
}
var elen = evens.length;
var olen = odds.length;
if (elen > olen)
{
return odds[0];
}
else
{
return evens[0];
}
}
答案 2 :(得分:1)
我有空闲时间......我做到了这一点,javascript非常有趣,可以很高兴获得另一种观点。
var numbers = [2,4,6,8,10,12,14,16,17,18,20];
function findOutlier(arr) {
var odds = arr.filter(function (number) {
return !!(number % 2)
});
var evens = arr.filter(function (number) {
return !(number % 2)
});
var result = (odds.length < evens.length) ? odds.pop() : evens.pop();
return result;
}
findOutlier(numbers);
答案 3 :(得分:0)
我发现了一种使用O(1)内存的方法。不会生成其他数组。它检查前3个值中有多少是偶数。如果该数字为2或更多,则查找奇数值。否则,它会寻找均值。
function findOutlier(arr) {
//Big O: memory = 1, time = n;
let evenCount = 0;
for(let i = 0; i < 3; i++) {
let val = arr[i];
if(val % 2 === 0) evenCount ++;
}
let isEven = evenCount > 1;
for (let i = 0; i < arr.length; i++) {
if((arr[i] % 2 === 0) !== isEven) return arr[i];
//Check to see if number is opposite of even counts boolean
}
return new Error('Array contains no outlier.');
}
&#13;
答案 4 :(得分:0)
function findOne(arr){
let evenOrOdd = {"even": [], "odd": []};
for(let i=0; i<arr.length; i++) {
let oddCount = evenOrOdd["odd"].length,
evenCount = evenOrOdd["even"].length;
if(oddCount===1 && evenCount>1 || evenCount===1 && oddCount>1) {
break;
}
arr[i]%2===1 ?
evenOrOdd["odd"].push(arr[i]) :
evenOrdOdd["even"].push(arr[i]);
});
return evenOrOdd["odd"].length===1 ?
evenOrOdd["odd"][0] :
evenOrOdd["even"][0];
}
答案 5 :(得分:0)
localeCompare
答案 6 :(得分:0)
检查前三个数字,如果其中两个相同,则返回异常值:
function findOutlier(integers){
//your code here
if (integers[0]%2 === 0 && integers[1]%2 === 0 ) {
return integers.find(integer => integer %2 !== 0)
} else if(integers[0]%2 !== 0 && integers[1]%2 !== 0) {
return integers.find(integer => integer % 2 === 0)
} else {
if(integers[2]%2 === 0){
return integers.find(integer => integer %2 !==0)
}
else {
return integers.find(integer => integer %2 ===0)
}
}
答案 7 :(得分:-1)
function findOutlier(integers) {
//your code here
integers.sort();
var count = 0;
for (var i = 0; i < 3; i++) {
if (integers[i] % 2 === 0) {
count += 1;
}
}
if (count >= 2) {
var r = integers.filter(function(x) {
return x % 2 !== 0;
});
} else {
var r = integers.filter(function(x) {
return x % 2 === 0;
});
}
return r[0];
}