Поиск медианы и удаление элементов

214
16 мая 2018, 09:00

Не могу в цикле удалить все элементы массива.

Медиана — это такое число выборки, что ровно половина из элементов выборки больше него, а другая половина меньше него.

Получается проблемма закулючается в том что не все элементы убираются в дилнныйх массивах, при переборе и удалении. Не знаю чего может не хватать, вроде бы по моей логике всё должно работать, но уберает всего несколько элементов из длинных массивов.

В случае же с короткими массивами всё отлично работает. Подскажите где я что не правильно сделал.

function median(data) { 
    var count = 0; 
     
    data.sort((a, b) => a - b); 
 
 
 
    for (var i = 0; i < data.length; i++) { 
        if (data.length % 2 === 0) { 
            data.pop(); 
            data.shift(); 
        } else if (data.length % 2 === 1) { 
            data.pop(); 
            data.shift(); 
            } 
        if (data.length === 2) { 
            for (var j = 0; j < data.length; j++) { 
                count = (data[0] + data[1]); 
                return count / 2; 
            } 
        } 
    } 
 
 
 
 
 
 
 
 
    return data; 
} 
 
console.log(median([1, 2, 3, 4, 5])); 
console.log(median([3, 1, 2, 5, 3])); 
console.log(median([1, 300, 2, 200, 1])); 
console.log(median([3, 6, 20, 99, 10, 15])); 
console.log(median([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); 
console.log(median([0,7,1,8,4,9,5,6,2,3])); 
console.log(median([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1])); 
console.log(median([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]));

Answer 1

Потому что вы модифицируете массив, по которому бежите. Не знаю, зачем вам вообще цикл, достаточно проверить, что если чилсо элементов четное, то взять два из середины и усреднить, если нет, то взять центральную чиселку.

Если же исправлять ваше то вот пример:

function median(data) { 
    var count = 0; 
     
    data.sort((a, b) => a - b); 
 
    do { 
          data.pop(); 
          data.shift(); 
    } while (data.length > 2) 
     
    if (data.length === 2) { 
        for (var j = 0; j < data.length; j++) { 
            count = (data[0] + data[1]); 
            return count / 2; 
        } 
    } 
 
    return data[0]; 
} 
 
console.log(median([1, 2, 3, 4, 5])); 
console.log(median([3, 1, 2, 5, 3])); 
console.log(median([1, 300, 2, 200, 1])); 
console.log(median([3, 6, 20, 99, 10, 15])); 
console.log(median([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); 
console.log(median([0,7,1,8,4,9,5,6,2,3])); 
console.log(median([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1])); 
console.log(median([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]));

Answer 2

function median(data) { 
  data.sort((a, b) => a - b); 
  if (data.length % 2) { 
    return data[Math.floor(data.length / 2)]; 
  } else { 
    return (data[data.length / 2] + data[data.length / 2 - 1]) / 2; 
  } 
} 
 
console.log(median([1, 2, 3, 4, 5])); 
console.log(median([3, 1, 2, 5, 3])); 
console.log(median([1, 300, 2, 200, 1])); 
console.log(median([3, 6, 20, 99, 10, 15])); 
console.log(median([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); 
console.log(median([0, 7, 1, 8, 4, 9, 5, 6, 2, 3])); 
console.log(median([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])); 
console.log(median([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]));

Answer 3

Но куда логичнее было бы сделать так:

const median = arr => { 
  const arrayHalf = arr.length / 2 
  const sorted = [].concat(arr).sort((a,b) => a - b) 
   
  return arr.length % 2 === 0 
  ? (sorted[arrayHalf] + sorted[arrayHalf + 1]) / 2 
  : sorted[~~(arrayHalf)] 
} 
 
console.log(median([1, 2, 3, 4, 5])); 
console.log(median([3, 1, 2, 5, 3])); 
console.log(median([1, 300, 2, 200, 1])); 
console.log(median([3, 6, 20, 99, 10, 15])); 
console.log(median([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); 
console.log(median([0,7,1,8,4,9,5,6,2,3])); 
console.log(median([1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1])); 
console.log(median([2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]));

READ ALSO
Как разделить переменную на букву и число

Как разделить переменную на букву и число

Есть переменная a, равная 'A13', как разделить ее на букву A и число 13, чтобы получилось var b=['A', '13']

217
JSON обработка данных вывод в HTML

JSON обработка данных вывод в HTML

Решил попробовать поработать с VK_API не зная JS, JSON, JQuery

205
Fetch, передача параметров в POST запрос

Fetch, передача параметров в POST запрос

У меня есть POST запрос: 'https://mysterious-reef-29460herokuapp

228