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
1
porque es mayor que
1
(índice 0), pero menor que
2
(índice 1). Asimismo,
getIndexToIns([20,3,5], 19)
debe regresar
2
porque una vez que la matriz ha sido ordenada se verá similar
[3,5,20]
y
19
es 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 volver3
.getIndexToIns([10, 20, 30, 40, 50], 35)
debe devolver un número.getIndexToIns([10, 20, 30, 40, 50], 30)
debería volver2
.getIndexToIns([10, 20, 30, 40, 50], 30)
debe devolver un número.getIndexToIns([40, 60], 50)
debería volver1
.getIndexToIns([40, 60], 50)
debe devolver un número.getIndexToIns([3, 10, 5], 3)
debería volver0
.getIndexToIns([3, 10, 5], 3)
debe devolver un número.getIndexToIns([5, 3, 20, 3], 5)
debería volver2
.getIndexToIns([5, 3, 20, 3], 5)
debe devolver un número.getIndexToIns([2, 20, 10], 19)
debería volver2
.getIndexToIns([2, 20, 10], 19)
debe devolver un número.getIndexToIns([2, 5, 10], 15)
debería volver3
.getIndexToIns([2, 5, 10], 15)
debe devolver un número.getIndexToIns([], 1)
debería volver0
.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 -1
si 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 :
- Insertar
num
enarr
. - Ordene
arr
de menor a mayor. - 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:
- Si la matriz de entrada está vacía, entonces tenemos que regresar
0
porquenum
sería el único elemento en esa matriz, por lo tanto en el índice0
. - Si
num
pertenecería al final dearr
ordenado de menor a mayor, entonces necesitamos devolver la longitud dearr
.
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 num
con cada número en nuestra entrada arr
y averiguar dónde encajaría en orden de menor a mayor.
Algoritmo :
- Si
arr
es una matriz vacía, regresa0
. - Si
num
pertenece al final de la matriz ordenada, devuelve la longitud dearr
. - Otherwise, return the index
num
would be ifarr
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!