В IQ тесте дается массив с числами.
Одно из них отличается от других четностью/нечетностью.
Функция возвращает его индекс.
function iqTest(str) {
array = str.split(' ');
var boolArray = [];
function checkEven(num) {
return +num % 2 === 0? true:false;
}
for (var i = 0; i < array.length; i++) {
boolArray.push(checkEven(array[i]));
}
var differ = boolArray[0];
var index = 1;
for (var j = 1; j < boolArray.length; j++) {
if (boolArray[j] !== differ) {
differ = boolArray[j];
index = j;
}
}
return index;
};
Но функция возвращает неверный индекс, когда отличный от других елемент - четное число
Как можно решить задачу, не сравнивая четность каждого элемента массива с четностью предыдущих:
Реализация:
function iqTest(array) {
var data = [[], []];
array.forEach(function(value, index) {
data[value % 2].push(index);
});
if (data[0].length == 1)
return data[0][0];
if (data[1].length == 1)
return data[1][0];
return -1;
}
console.log(iqTest([1, 3, 5, 2]));
При желании можно расширить алгоритм для проверки остатка от деления на произвольное (заданное) число:
function iqTest(array, base) {
var data = [];
for (var i = 0; i < base; i++)
data.push([]);
array.forEach(function(value, index) {
data[value % base].push(index);
});
for (var i = 0; i < base; i++) {
if (data[i].length == 1)
return data[i][0];
}
return -1;
}
console.log(iqTest([1, 2, 3, 4, 5], 3));
Сборка персонального компьютера от Artline: умный выбор для современных пользователей