Во-первых, я новичок, практикующий свой JavaScript. Мое решение этой проблемы будет опубликовано. Думаю, стоит упомянуть, что на решение проблемы ушло почти два дня размышлений. Проблема: Мне необходимо написать алгоритм, который будет возвращать режим (ы) из заданного входного массива. Например:

mode([4, 5, 6, 6, 6, 7, 7, 9, 10]) ➞ [6]

mode([4, 5, 5, 6, 7, 8, 8, 9, 9]) ➞ [5, 8, 9]

mode([1, 2, 2, 3, 6, 6, 7, 9]) ➞ [2, 6]

Решение:

function mode(nums) {
  let array = [...nums]
  array = array.sort((a, b) => a - b) //sorts the array from lowest value

  // function to figure out the unique numbers and return as an array
  function uniqueNums(array) {
    let uniques = []
    for (let i = 0; i < array.length; i++) {
      if (!uniques.includes(array[i])) {
        uniques.push(array[i])
      }
    }
    return uniques
  }

  //function to return the mode of every unique number

  function counter(array) {
    let modes = []
    for (let i = 0; i < array.length; i++) {
      let count = 1, // keeps track of occurrence's of a number
        track = 1 //variable enables the while loop keep checking
      while (array[i] === array[i + track]) {
        count++
        track++
      }
      modes.push(count)
      i += count - 1
    }
    return modes
  }

  //function to return the highest mode(s)
  function highestMode(uniques, modes) {
    let highest = [],
      max = 0 //tracks our highest number in the array

    //loops to find highest mode
    for (let i = 0; i < modes.length; i++) {
      if (max < modes[i]) {
        max = modes[i]
      }
    }

    //loops to push position of modes equal to the highest mode
    for (let i = 0; i < modes.length; i++) {
      if (max === modes[i]) {
        highest.push(i)
      }
    }

    //uses the position of highest modes to swap them with their 
    //actual values
    let result = highest.map(a => a = uniques[a])
    return result
  }
  return highestMode(uniqueNums(array), counter(array))
}


console.log(mode([4, 4, 4, 6, 8, 9, 10, 10]))
-1
Frank Imade 20 Янв 2021 в 21:41

2 ответа

Лучший ответ

Я бы подсчитал количество вхождений каждого элемента в карту. Затем используйте Math.max, чтобы найти наибольшее значение (я) на карте, а затем возьмите ключи, которые равны этому наибольшему значению:

const mode = arr => {
  const grouped = new Map();
  for (const item of arr) {
    grouped.set(item, (grouped.get(item) || 0) + 1);
  }
  const maxCount = Math.max(...grouped.values());
  return [...grouped.entries()]
    .filter(([, count]) => count === maxCount)
    .map(([key]) => key);
};

console.log(mode([4, 5, 6, 6, 6, 7, 7, 9, 10])) // ➞ [6]
console.log(mode([4, 5, 5, 6, 7, 8, 8, 9, 9])) // ➞ [5, 8, 9]
console.log(mode([1, 2, 2, 3, 6, 6, 7, 9])) // ➞ [2, 6]
1
CertainPerformance 20 Янв 2021 в 18:47

Более простой и оптимизированный подход с одной итерацией

https://jsfiddle.net/dv7f9nxr/

function mode(items) {
  var result = [];
  var count = {};
  var highest= 0;

  items.map((item) => {
    var itemCount = (count[item] || 0) + 1;
    count[item] = itemCount
    if (itemCount > 1) {
      if(itemCount > highest) {
        highest = itemCount;
        //reset 
        result = [item];
      } else if (itemCount === highest){
        result.push(item);
      }
    }

  })
 
  
  
  return result;
}

console.log(mode([2, 3, 9, 6, 9]))
console.log(mode([2, 3,2, 9, 6, 9]))
console.log(mode([2, 3,2, 9, 6, 9,2]))
console.log(mode([2, 3, 9, 6, 9,6,2]))

0
Wakeel 20 Янв 2021 в 19:40