Cómo encontrar el índice al que pertenece un número en una matriz en JavaScript

La clasificación es un concepto muy importante al escribir algoritmos. Hay todo tipo de tipos: tipo burbuja, tipo concha, tipo bloque, tipo peine, tipo cóctel, tipo gnomo.

Este desafío nos da una idea de este maravilloso mundo. Tenemos que ordenar una matriz de números de menor a mayor y averiguar dónde pertenecería un número dado en esa matriz.

Instrucciones de algoritmo

Devuelve el índice más bajo en el que se debe insertar un valor (segundo argumento) en una matriz (primer argumento) una vez que se ha ordenado. El valor devuelto debe ser un número. Por ejemplo, getIndexToIns([1,2,3,4], 1.5)debe regresar 1porque es mayor que 1(índice 0), pero menor que 2(índice 1). Asimismo, getIndexToIns([20,3,5], 19)debe regresar 2porque una vez que la matriz ha sido ordenada se verá similar [3,5,20]y 19es menor que 20(índice 2) y mayor que 5(índice 1).
function getIndexToIns(arr, num) { return num; } getIndexToIns([40, 60], 50);

Casos de prueba proporcionados

  • getIndexToIns([10, 20, 30, 40, 50], 35)debería volver 3.
  • getIndexToIns([10, 20, 30, 40, 50], 35) debe devolver un número.
  • getIndexToIns([10, 20, 30, 40, 50], 30)debería volver 2.
  • getIndexToIns([10, 20, 30, 40, 50], 30) debe devolver un número.
  • getIndexToIns([40, 60], 50)debería volver 1.
  • getIndexToIns([40, 60], 50) debe devolver un número.
  • getIndexToIns([3, 10, 5], 3)debería volver 0.
  • getIndexToIns([3, 10, 5], 3) debe devolver un número.
  • getIndexToIns([5, 3, 20, 3], 5)debería volver 2.
  • getIndexToIns([5, 3, 20, 3], 5) debe devolver un número.
  • getIndexToIns([2, 20, 10], 19)debería volver 2.
  • getIndexToIns([2, 20, 10], 19) debe devolver un número.
  • getIndexToIns([2, 5, 10], 15)debería volver 3.
  • getIndexToIns([2, 5, 10], 15) debe devolver un número.
  • getIndexToIns([], 1)debería volver 0.
  • getIndexToIns([], 1) debe devolver un número.

Solución # 1: .sort (), .indexOf ()

PEDAC

Comprensión del problema : tenemos dos entradas, una matriz y un número. Nuestro objetivo es devolver el índice de nuestro número de entrada después de que se clasifique en la matriz de entrada.

Ejemplos / Casos de prueba : La buena gente de freeCodeCamp no nos dice de qué manera se debe ordenar la matriz de entrada, pero los casos de prueba proporcionados dejan en claro que la matriz de entrada debe ordenarse de menor a mayor.

Tenga en cuenta que hay un caso límite en los dos últimos casos de prueba proporcionados donde la matriz de entrada es una matriz vacía.

Estructura de datos : dado que, en última instancia, devolvemos un índice, seguir con las matrices nos funcionará.

Vamos a utilizar un método ingenioso llamado .indexOf():

.indexOf()devuelve el primer índice en el que un elemento está presente en una matriz, o un -1si el elemento no está presente en absoluto. Por ejemplo:

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

También usaremos .concat()aquí en lugar de .push(). ¿Por qué? Porque cuando agrega un elemento a una matriz usando .push(), devuelve la longitud de la nueva matriz. Cuando agrega un elemento a una matriz usando .concat(), devuelve la nueva matriz en sí. Por ejemplo:

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

Algoritmo :

  1. Insertar numen arr.
  2. Ordene arrde menor a mayor.
  3. Devuelve el índice de num.

Código : ¡Ver abajo!

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);

Sin variables locales y comentarios:

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

Solución # 2: .sort (), .findIndex ()

PEDAC

Comprensión del problema : tenemos dos entradas, una matriz y un número. Nuestro objetivo es devolver el índice de nuestro número de entrada después de que se clasifique en la matriz de entrada.

Ejemplos / Casos de prueba : La buena gente de freeCodeCamp no nos dice de qué manera se debe ordenar la matriz de entrada, pero los casos de prueba proporcionados dejan en claro que la matriz de entrada debe ordenarse de menor a mayor.

Hay dos casos extremos a tener en cuenta con esta solución:

  1. Si la matriz de entrada está vacía, entonces tenemos que regresar 0porque numsería el único elemento en esa matriz, por lo tanto en el índice 0.
  2. Si numpertenecería al final de arrordenado de menor a mayor, entonces necesitamos devolver la longitud de arr.

Estructura de datos : dado que, en última instancia, devolvemos un índice, seguir con las matrices nos funcionará.

Echemos un .findIndex()vistazo para ver cómo ayudará a resolver este desafío:

.findIndex()devuelve el índice del primer elemento de la matriz que satisface la función de prueba proporcionada. De lo contrario, devuelve -1, lo que indica que ningún elemento pasó la prueba. Por ejemplo:

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

Esto es útil para nosotros porque podemos usar .findIndex()para comparar nuestra entrada numcon cada número en nuestra entrada arry averiguar dónde encajaría en orden de menor a mayor.

Algoritmo :

  1. Si arres una matriz vacía, regresa 0.
  2. Si numpertenece al final de la matriz ordenada, devuelve la longitud de arr.
  3. Otherwise, return the index num would be if arr was sorted from least to greatest.

Code: See below!

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);

Without local variables and comments:

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);

If you have other solutions and/or suggestions, please share in the comments!

This article is a part of the series freeCodeCamp Algorithm Scripting.

This article references freeCodeCamp Basic Algorithm Scripting: Where do I Belong.

You can follow me on Medium, LinkedIn, and GitHub!