Како пронаћи индекс где број припада низу у ЈаваСцрипт-у

Сортирање је веома важан појам приликом писања алгоритама. Постоје све врсте врста: сортирање у облику мехурића, сортирање у љусци, блок сортирање, сортирање чешљем, сортирање коктела, сорта гноме - не измишљам их!

Овај изазов нам даје увид у чудесан свет такве врсте. Морамо сортирати низ бројева од најмањег до највећег и сазнати где би дати број припадао том низу.

Упутства за алгоритам

Врати најнижи индекс по којем вредност (други аргумент) треба да се убаци у низ (први аргумент) након што се сортира. Враћена вредност би требало да буде број. На пример, getIndexToIns([1,2,3,4], 1.5)требало би да се врати 1јер је већа од 1(индекс 0), али мања од 2(индекс 1). Исто тако, getIndexToIns([20,3,5], 19)требало би да се врати, 2јер када је низ сортиран, изгледат ће [3,5,20]и 19мањи је од 20(индекс 2) и већи од 5(индекс 1).
function getIndexToIns(arr, num) { return num; } getIndexToIns([40, 60], 50);

Обезбеђени тест случајеви

  • getIndexToIns([10, 20, 30, 40, 50], 35)треба да се врате 3.
  • getIndexToIns([10, 20, 30, 40, 50], 35) треба да врати број.
  • getIndexToIns([10, 20, 30, 40, 50], 30)треба да се врате 2.
  • getIndexToIns([10, 20, 30, 40, 50], 30) треба да врати број.
  • getIndexToIns([40, 60], 50)треба да се врате 1.
  • getIndexToIns([40, 60], 50) треба да врати број.
  • getIndexToIns([3, 10, 5], 3)треба да се врате 0.
  • getIndexToIns([3, 10, 5], 3) треба да врати број.
  • getIndexToIns([5, 3, 20, 3], 5)треба да се врате 2.
  • getIndexToIns([5, 3, 20, 3], 5) треба да врати број.
  • getIndexToIns([2, 20, 10], 19)треба да се врате 2.
  • getIndexToIns([2, 20, 10], 19) треба да врати број.
  • getIndexToIns([2, 5, 10], 15)треба да се врате 3.
  • getIndexToIns([2, 5, 10], 15) треба да врати број.
  • getIndexToIns([], 1)треба да се врате 0.
  • getIndexToIns([], 1) треба да врати број.

Решење # 1: .сорт (), .индекОф ()

ПЕДАЦ

Разумевање проблема : Имамо два улаза, низ и број. Циљ нам је вратити индекс нашег улазног броја након што се сортира у улазни низ.

Примери / случајеви тестирања : Добри људи у фрееЦодеЦамп-у нам не говоре на који начин треба сортирати улазни низ, али наведени тест случајеви јасно показују да улазни низ треба сортирати од најмањег до највећег.

Приметите да постоји ивични случај у последња два наведена случаја где је улазни низ празан низ.

Структура података : Пошто коначно враћамо индекс, лепљење низова ће нам успети.

Користићемо сјајну методу која се зове .indexOf():

.indexOf()враћа први индекс код којег је елемент присутан у низу, или -1ако елемент уопште није присутан. На пример:

let food = ['pizza', 'ice cream', 'chips', 'hot dog', 'cake']
food.indexOf('chips')// returns 2food.indexOf('spaghetti')// returns -1

Такође ћемо користити .concat()овде уместо .push(). Зашто? Јер када додате елемент у низ помоћу .push(), он враћа дужину новог низа. Када додате елемент у низ помоћу .concat(), он сам враћа нови низ. На пример:

let array = [4, 10, 20, 37, 45]
array.push(98)// returns 6array.concat(98)// returns [4, 10, 20, 37, 45, 98]

Алгоритам :

  1. Уметни numу arr.
  2. Поредај arrод најмање до најбоље.
  3. Врати индекс од num.

Шифра : Погледајте доле!

function getIndexToIns(arr, num) { // Insert num into arr, creating a new array. let newArray = arr.concat(num) // [40, 60].concat(50) // [40, 60, 50] // Sort the new array from least to greatest. newArray.sort((a, b) => a - b) // [40, 60, 50].sort((a, b) => a - b) // [40, 50, 60] // Return the index of num which is now // in the correct place in the new array. return newArray.indexOf(num); // return [40, 50, 60].indexOf(50) // 1 } getIndexToIns([40, 60], 50);

Без локалних променљивих и коментара:

function getIndexToIns(arr, num) { return arr.concat(num).sort((a, b) => a - b).indexOf(num); } getIndexToIns([40, 60], 50);

Решење # 2: .сорт (), .финдИндек ()

ПЕДАЦ

Разумевање проблема : Имамо два улаза, низ и број. Циљ нам је вратити индекс нашег улазног броја након што се сортира у улазни низ.

Примери / случајеви тестирања : Добри људи у фрееЦодеЦамп-у нам не говоре на који начин треба сортирати улазни низ, али наведени тест случајеви јасно показују да улазни низ треба сортирати од најмањег до највећег.

Постоје два основна случаја која треба узети у обзир код овог решења:

  1. Ако је улазни низ празан онда треба да се вратимо 0јер numби то био једини елемент у том низу, дакле у индексу 0.
  2. Ако numби припадало на самом крају arrсортирано од најмање до највећег, онда морамо вратити дужину од arr.

Структура података : Пошто коначно враћамо индекс, лепљење низова ће нам успети.

Идемо на наплату .findIndex()да видимо како ће то помоћи да се реши овај изазов:

.findIndex()враћа индекс првог елемента у низу који задовољава пружену функцију тестирања. У супротном, враћа -1, што значи да ниједан елемент није прошао тест. На пример:

let numbers = [3, 17, 94, 15, 20] numbers.findIndex((currentNum) => currentNum % 2 == 0) // returns 2 numbers.findIndex((currentNum) => currentNum > 100) // returns -1

Ово је корисно за нас јер можемо .findIndex()да упоредимо свој унос numса сваким бројем у нашем уносу arrи схватимо где би се уклапао у ред од најмање до највећег.

Алгоритам :

  1. Ако arrје празан низ, вратите се 0.
  2. Ако numприпада крају сортираног низа, вратите дужину arr.
  3. У супротном, ретурн индекс numби био ако arrје сортиран од најмање до највећег.

Шифра : Погледајте доле!

function getIndexToIns(arr, num) { // Sort arr from least to greatest. let sortedArray = arr.sort((a, b) => a - b) // [40, 60].sort((a, b) => a - b) // [40, 60] // Compare num to each number in sortedArray // and find the index where num is less than or equal to // a number in sortedArray. let index = sortedArray.findIndex((currentNum) => num  50  falsy // [40, 60].findIndex(60 => 50  truthy // returns 1 because num would fit like so [40, 50, 60] // Return the correct index of num. // If num belongs at the end of sortedArray or if arr is empty // return the length of arr. return index === -1 ? arr.length : index } getIndexToIns([40, 60], 50);

Без локалних променљивих и коментара:

function getIndexToIns(arr, num) { let index = arr.sort((a, b) => a - b).findIndex((currentNum) => num <= currentNum) return index === -1 ? arr.length : index } getIndexToIns([40, 60], 50);

Ако имате друга решења и / или сугестије, молимо вас поделите их у коментарима!

Овај чланак је део серије скриптирање алгоритма фрееЦодеЦамп.

Овај чланак упућује на скрипте за основни алгоритам ФрееЦодеЦамп: Где да припадам.

Можете ме пратити на Медиум, ЛинкедИн и ГитХуб!