🗓 Publicado el 1 de julio de 2019
Notas sobre ejercicios de algoritmos y estructuras de datos vistos en HackerRank y otras fuentes. Se irán agregando mas a esta nota conforme se vayan resolviendo.
Dado un arreglo de enteros, calcular las fracciones de sus elementos que sean positivos, negativos o ceros. Imprimir el valor decimal de cada fracción en una nueva línea
La solución en JavaScript fue la siguiente:
function main() {
var n = parseInt(readLine());
arr = readLine().split(' ');
arr = arr.map(Number);
let pos = 0;
let negs = 0;
let zeroes = 0;
for(var i = 0; i < n; i++){
if(arr[i]>0){pos++;}
else if (arr[i]===0){zeroes++;}
else{negs++;}
}
console.log(pos/n+'\n'+negs/n+'\n'+zeroes/n);
}
Considere una escalera de tamaño n = 4
#
##
###
####
Observe que la base y la altura son iguales a n, y que la imagen es dibujada utilizando caracteres
#y espacios. La última línea no contiene ningún espacio. Deberá escribir una función que imprima una escalera de tamaño n.
La primer solución a la que llegué fue la siguiente:
function main() {
var n = parseInt(readLine());
let spaces = n-1;
let hashes = n - spaces;
let output = [];
for(var i = 0; i < n; i++){
for(var index1 = 0; index1 < spaces; index1++){output.push(' ');}
for(var index2 = 0; index2 < hashes; index2++){output.push('#');}
if(i < n-1){output.push('\n');}
spaces--;
hashes++;
}
var res = output.join('');
console.log(res);
}
nspaces a imprimir en la primer línea restando n - 1n - spaces. Se declara un arreglo vacío para almacenar el resultado.\n en todas excepto en la última repeticiónEsta solución tiene una complejidad O(N (A + B))
Una solución más eficiente es:
i
n - i - 1# repetido i + 1\nconst staircase = n => {
let stair = ''
for (let i = 0; i < n; i++) {
stair += ' '.repeat(n - i - 1) + '#'.repeat(i + 1) + '\n'
}
console.log(stair)
}
Esta solución tiene una complejidad O(N)
Escribir una función que acepte un entero positivo
n. La función debe imprimir en consola una media pirámide con N niveles usando el caracter#. Asegurarse que la forma tenga espacios a la derecha del caracter mencionado.Por ejemplo:
steps(2)
'# '
'##'
steps(3)
'# '
'## '
'###'
steps(4)
'# '
'## '
'### '
'####'
La primer solución en JavaScript es la siguiente:
# inicializado en 1n - 1# y de espacios correspondientes a su respectivo contador#function steps (n) {
let pounds = 1
let spaces = n - 1
for (let x = 0; x < n; x++) {
let result = ''
for (let y = 0; y < pounds; y++) {
result += '#'
}
for (let z = 0; z < spaces; z++) {
result += ' '
}
console.log(result)
pounds++
spaces--
}
}
Esta solución tiene una complejidad O(N (A + B))
Otra solución más eficiente:
row y column inicializadas en 0, para controlar el valor de las filas y las columnas# al resultado, de lo contrario concatenar un espacioconst steps = n => {
let row = 0
let col = 0
for (row; row < n; row++) {
let result = ''
for (col; col < n; col++) {
if (col <= row) result += '#'
else result += ' '
}
console.log(result)
}
}
Esta solución tiene una complejidad O(N2)
Finalmente una solución recursiva tomando como base la representación matricial del problema a continuación.
Tomando en cuenta estos consejos para escribir funciones recursivas procederemos a:
n, row, y resultn deberá ser introducido por el usuario, row siempre inicia en 0, y result siempre en cadena vacían + 1)# a la cadena resultado, de lo contrario concatenamos un espacio y seguimos trabajando en la fila actualconst steps = (n, row = 0, result = '') => {
if (n === row) return
if (result.length === n) {
console.log(result)
return steps(n, row + 1)
}
if (result.length <= row) result += '#'
else result += ' '
steps(n, row, result)
}
Escribir una función que acepte como argumento un entero positivo
n. La función deberá imprimir en consola una forma piramidal con n niveles usando el caracter#. Asegurarse que la pirámide tenga espacios en ambos lados (izquierdo y derecho) del caracter mencionado. Ejemplos:
pyramid(1)
'#'
pyramid(2)
' # '
'###'
pyramid(3)
' # '
' ### '
'#####'
pyramid(4)
' # '
' ### '
' ##### '
'#######'
La primer solución a la que llegué fue la siguiente:
function pyramid (n) {
let pounds = 1
let spaces = n - 1
for (let x = 0; x < n; x++) {
let level = ''
for (let s = 0; s < spaces; s++) {
level += ' '
}
for (let p = 0; p < pounds; p++) {
level += '#'
}
for (let s = 0; s < spaces; s++) {
level += ' '
}
console.log(level)
spaces = spaces - 1
pounds = pounds + 2
}
}
Esta solución tiene una complejidad O(N (A + B))
Una solución más elegante, basada en una progresión aritmética para encontrar el n-ésimo número impar (2 * n - 1) :
En nuestra función para generar la pirámide:
const nthNumber = n => 2 * n - 1
const pyramid = n => {
for (let i = 1; i <= n; i++) {
let hashes = '#'.repeat(nthNumber(i))
let spaces = ' '.repeat((nthNumber(n) - hashes.length) / 2)
console.log(spaces + hashes + spaces)
}
}
Esta solución tiene una complejidad O(N)
Una solución recursiva para el problema de la pirámide es:
n, fila, y niveln deberá ser introducido por el usuario, fila siempre inicia en 0, y nivel siempre en cadena vacíafila + 1(2 * n -1) / 2 redondeado hacia abajo a un entero# al nivel, de lo contrario concatenamos un espacio y seguimos trabajando en la fila actual, invocando la función recursiva con la fila actual.const pyramid = (n, fila = 0, nivel = '') => {
if (fila === n) return
if (nivel.length === (2 * n - 1)) {
console.log(nivel)
return pyramid(n, fila + 1)
}
const mid = Math.floor((2 * n - 1) / 2)
if (nivel.length >= mid - fila && nivel.length <= mid + fila) nivel += '#'
else nivel += ' '
pyramid(n, fila, nivel)
}
Escribir una función que acepte un entero N y retorne una matriz espiral de N x N.
Por ejemplo:
matrix(2)
[[1, 2],
[4, 3]]
matrix(3)
[[1, 2, 3],
[8, 9, 4],
[7, 6, 5]]
matrix(4)
[[1, 2, 3, 4],
[12, 13, 14, 5],
[11, 16, 15, 6],
[10, 9, 8, 7]]
Esta solución radica en establecer variables para las filas y columnas iniciales y finales e irlas moviendo para rellenar la matriz. Para una matriz de 3x3 visualizaremos la Columna Inicial (CI) y Fila Inicial (FI) con el índice 0, y la Columna Final (CF) y Fila Final (FF) con el índice 2 (para este caso particular de una matriz con n=3)
CI=0 CF=2
FI=0 [[1, 2, 3],
[8, 9, 4],
FF=2 [7, 6, 5]]
El pseudocódigo es el siguiente:
resultadocolumnaInicial sea menor o igual a columnaFinal Y filaInicial sea menor o igual a finaFinal:
columnaInicial hasta columnaFinal
resultado[filaInicial][i] asignar contadorcontadorfilaInicialfilaInicial hasta filaFinal
resultado[i][columnaFinal] asignar contadorcontadorcolumnaFinalcolumnaFinal hasta columnaInicial
resultado[filaFinal][i] asignar contadorcontadorfinalFinalfilaFinal a filaInicial
resultado[i][columnaInicial] asignar contadorcontadorcolumnaInicialfunction matrix (n, columnaInicial = 0, filaInicial = 0, columnaFinal = n - 1, filaFinal = n - 1) {
const resultado = []
for (let i = 0; i < n; i++) {
resultado.push([])
}
let contador = 1
while (columnaInicial <= columnaFinal && filaInicial <= filaFinal) {
// Fila superior
for (let i = columnaInicial; i <= columnaFinal; i++) {
resultado[filaInicial][i] = contador
contador++
}
filaInicial++
// Columna derecha
for (let i = filaInicial; i <= filaFinal; i++) {
resultado[i][columnaFinal] = contador
contador++
}
columnaFinal--
// Fila inferior
for (let i = columnaFinal; i >= columnaInicial; i--) {
resultado[filaFinal][i] = contador
contador++
}
filaFinal--
// Columna izquierda
for (let i = filaFinal; i >= filaInicial; i--) {
resultado[i][columnaInicial] = contador
contador++
}
columnaInicial++
}
return resultado
}
Imprimir el n-ésimo número de la serie de Fibonacci, la cual es una sucesión de números donde cada elemento es la suma de los dos anteriores. Por ejemplo, la secuencia
[0, 1, 1, 2, 3, 4, 8, 13, 21, 34]
son los primeros 10 elementos de la serie de Fibonacci. Para nuestra función, un ejemplo sería:
fib(4) = 3
La solución iterativa es la siguiente:
previo y actual, inicializadas en 0 y 1 respectivamente.actual sumando actual mas previoprevio restando actual menos previoactualfunction fib (n) {
if (n <= 1) return n
else {
let previo = 0
let actual = 1
for (let i = 1; i < n; i++) {
actual += previo
previo = actual - previo
}
return actual
}
}
Esta solución tiene una complejidad de O(N).
Una solución recursiva es la siguiente:
n es menor a 2, retornamos nfunction fib (n) {
if (n < 2) return n
return fib(n - 1) + fib(n - 2)
}
Esta solución no es la más óptima, ya que radica en devanar o desenvolver la función hasta obtener las funciones fibonacci de los únicos dos valores que ya conocemos, 0 y 1. Tiene una complejidad de O(2N).
Escribir una función que acepte una cadena y retorne el número de vocales usadas en ella. Por ejemplo:
vowels('Hi There!') --> 3
vowels('Why do you ask?') --> 4
vowels('Why?') --> 0
La primer solución es iterativa y consiste en:
function vowels (str) {
const vowelArr = ['a', 'e', 'i', 'o', 'u']
let count = 0
for (let v of vowelArr) {
if (str.toLowerCase().indexOf(v) > -1) count ++
}
return count
}
Otra solución, basada en el uso de una expresión regular:
const vowels = str => {
let vowelCount = str.match(/[aeiou]/ig)
return vowelCount ? vowelCount.length : 0
}
Dados 5 números enteros positivos, encontrar los valores mínimo y máximo que pueden ser calculados al sumar exactamente 4 de los 5. Posteriormente imprimir los valores mínimo y máximo en una sola línea.
La solución ideada en JavaScript es la siguiente:
function miniMaxSum(arr) {
let total = 0
arr = arr.sort()
for (let i = 0; i < arr.length; i++) {
total += arr[i]
}
const max = total - arr[0]
const min = total - arr[arr.length-1]
console.log(`${min} ${max}`)
}
Se colocarán velas en un pastel del cumpleaños a razón de una vela por cada año del total de la edad del cumpleañero. Las velas tienen diferente longitud y, al soplar las velas, sólo las de mayor longitud se lograrán apagar. Se deberá encontrar cuántas velas se pueden apagar exitosamente al soplar una vez.
Las velas estarán representadas por un arreglo de enteros.
La solución ideada en JavaScript es la siguiente:
function birthdayCakeCandles(ar) {
const max = Math.max(...ar)
return ar.filter(x => x === max).length
}
Dada una hora en formato de 12 horas AM/PM, convertirla a formato militar (24 horas). Nota: la media noche es a las 12:00:00AM en formato de 12 horas y las 00:00:00 en formato de 24 horas. El mediodía es a las 12:00:00PM en formato de 12 horas y las 12:00:00 en formato de 24 horas.
La solución ideada en JavaScript es la siguiente:
function timeConversion(s) {
const amPM = s.substring(s.length - 2, s.length)
let hrs = s.substring(0, 2)
console.log(hrs)
if (amPM === 'AM') {
if (hrs === '12') hrs = '00'
return (hrs + s.substring(2, s.length - 2))
}
else {
if (hrs !== '12') hrs = parseInt(hrs) + 12
return ('' + hrs + s.substring(2, s.length - 2))
}
}
00. Posteriormente retornamos la subcadena con el valor de las horas, minutos y segundos12, calculamos el valor de las horas convirtiéndolas a número y sumando 12. Finalmente retornamos una cadena con el valor de las horas, minutos y segundosUna universidad tiene ciertas políticas de aprobar materias:
- Cada estudiante recibe una calificación dentro de un rango de 0 a 100
- Cualquier calificación menor a 40 es reprobatoria
Sam es un profesor de esa universidad y le gusta redondear la calificación de sus estudiantes de acuerdo a las siguientes reglas:
- Si la diferencia entre la calificación y el siguiente múltiplo de 5 es menor a 3, redondear hacia arriba la calificación hasta el siguiente múltiplo de 5
- Si la calificación es menor a 38, no se redondea y el resultado será reprobatorio
Por ejemplo una calificación de 84 se redondea a 85 pero una de 29 no.
La solución ideada en JavaScript es la siguiente:
function gradingStudents(grades) {
let finalGrades = []
for (let i = 0; i < grades.length; i++) {
if (grades[i] < 38) finalGrades.push(grades[i])
else {
const nextDividendOf5 = Math.ceil(grades[i] / 5) * 5
if (nextDividendOf5 - grades[i] < 3) finalGrades.push(nextDividendOf5)
else finalGrades.push(grades[i])
}
}
return finalGrades
}
Un vendedor de calcetines tiene una pila de ellos que debe ordenar en pares de acuerdo a su color. Dado un arreglo de enteros que representa el color de cada calcetín, determinar cuántos pares de calcetines con el mismo color existen.
Por ejemplo, hay
n = 7calcetines con coloresar = [1, 2, 3, 2, 1, 3, 2]. Existe un par de color1y otro de color2. También hay tres calcetines sin par, uno de cada color. El número de pares es2.
Se propone la siguiente solución:
function sockMerchant(n, ar) {
let sockMap = {}
let result = 0
for (let sock of ar) {
sockMap[sock] ? sockMap[sock]++ : sockMap[sock] = 1
}
for (let sock in sockMap) {
if (sockMap[sock] > 1) {
result = result + Math.floor(sockMap[sock] / 2)
}
}
return result
}
sockMap donde crearemos un mapa de cada color de calcetines.resultUn montañista toma nota de la topografía en sus salidas. Durante su última salida recorrió exactamente
npasos. Por cada paso que recorrió anotó si era un paso hacia arriba conUo si era un paso hacia abajo conD. Las salidas del montañista siempre inician y terminan a nivel del mar y cada paso hacia arriba o hacia abajo representa un cambio de unidad de1en la altitud.
Una montaña es una secuencia de pasos consecutivos por arriba del nivel del mar, iniciando con un paso arriba del nivel del mar y terminando con un paso abajo, a nivel del mar.
De forma análoga, un valle es una secuencia de pasos consecutivos por debajo del nivel del mar, iniciando con un paso debajo del nivel del mar y terminando con un paso arriba, a nivel del mar.
Dada una secuencia de pasos hacia arriba y hacia abajo de una de sus salidas, determinar el número de valles que recorrió.
Por ejemplo, si los pasos son
s = [DDUUUUDD], primero entra a un valle a2unidades de profundidad. Después escala una montaña con2unidades de altura y finalmente regresa a nivel del mar y finaliza su trayecto.Explicación gráfica: Si representamos el nivel del mar con
_, un paso hacia arriba con/y un paso hacia abajo con\, el trayecto del montañista puede representarse como:
_/\ _
\ /
\/\/
En esta salida, el montañista entró y salió de
1valle
Se propone la siguiente solución:
function countingValleys(n, s) {
const steps = [...s]
let level = 0
let valleys = 0
for (let step of steps) {
if (step === 'D') level--
else if (step === 'U') {
level++
if (level === 0) valleys++
}
}
return valleys
}
steps y, dado que el formato de los pasos s es una cadena, utilizamos el operador spread para convertirlo en un arreglo. También declaramos las variables level y valleys para contabilizar el nivel de altitud y el número de valles encontrados.D, decrementamos el nivel una unidadU incrementamos el nivel una unidad y verificamos si el nivel es 0, esto significa que le montañista ha salido del valle, por lo que incrementamos el contador valleysDada una cadena, retornar una cadena de caracteres en orden inverso a la original.
Se implementaron tres soluciones en JavaScript. La primera es:
function reverse (str) {
return [...str].reverse().join('')
}
str''La segunda propuesta de solución es la siguiente:
function reverse (str) {
let reversed = ''
for (let character of str) {
reversed = character + reversed
}
return reversed
}
reversed donde almacenaremos el resultadostr y almacenamos el caracter actual en la variable reversed para después concatenarle el resto de la misma variableLa tercer propuesta de solución es la siguiente:
function reverse (str) {
return [...str].reduce((prev, current) => current + prev)
}
strDada una cadena, retornar
truesi la cadena es palíndromo ofalsesi no lo es. Un palíndromo es una palabra o frase que se lee igual de adelante hacia atrás que de atrás hacia adelante.Nota: se deberán tomar en cuenta espacios y signos de puntación al determinar si la cadena es un palíndromo. Ejemplos:
palindrome("abba") === true
palindrome("abcdefg") === false
Se proponen dos soluciones en JavaScript. La primera es:
function palindrome (str) {
return [...str].every((char, i) => {
return char === str[str.length - i - 1]
})
}
str en un arreglo y utilizamos el método Array.every para comparar el primer caracter con el último y probar si son iguales, en la siguiente iteración se comparará el segundo con el antepenúltimo y así sucesivamente. Nota: Esta solución no es la más óptima pues se hacen más comparaciones de las necesarias para determinar si la cadena es un palíndromo.Para la siguiente solución me basé en el ejercicio anterior Reverse String para implementarla:
function palindrome (str) {
let reversed = [...str].reduce((previo, actual) => actual + previo)
return reversed === str
}
Dado un entero, retornar el entero que es el valor invertido de sus números. Por ejemplo:
reverseInt(15) === 51
reverseInt(981) === 189
reverseInt(500) === 5
reverseInt(-15) === -51
reverseInt(-90) === -9
La primer solución que hice es la siguiente:
function reverseInt (n) {
let result = n.toString().split('').reverse()
if (result.indexOf('-') > -1) {
result.pop()
return parseInt(result.join('')) * -1
}
return parseInt(result.join(''))
}
- que nos indica si es un número negativo. Si lo encontramos significa que el caracter estará al final del arreglo y lo sacamos usando el método Array.pop. Posteriormente convertimos el arreglo a cadena, la cadena a número entero con el método parseInt(), lo multiplicamos por -1 y retornamos el resultadoOtra solución más óptima es la siguiente:
function reverseInt(n) {
let reversed = n.toString().split('').reverse().join('')
return parseInt(reversed) * Math.sign(n)
}
join('')Dada una cadena, retornar el caracter más usado dentro de dicha cadena. Por ejemplo:
maxChar("abcccccccd") === "c"
maxChar("apple 1231111") === "1"
Este algoritmo puede aplicarse para resolver diferentes tipos de problemas, como el contar el caracter más usado en una cadena, determinar si una palabra A es anagrama de la palabra B o verificar si una cadena tiene caracteres repetidos.
La solución en JavaScript es la siguiente:
function maxChar (str) {
let charMap = {}
let maxChar = ''
let max = 0
for (const char of str) {
charMap[char] ? charMap[char]++ : charMap[char] = 1
}
for (let char in charMap) {
if (charMap[char] > max) {
max = charMap[char]
maxChar = char
}
}
return maxChar
}
charMap que utilizaremos como mapa de caracteres para almacenar las ocurrencias de un mismo caracter dentro de la cadena a analizar.max y maxChar y utilizamos un for...in para iterar las llaves de nuestro mapa de caracteres, almacenando el valor máximo de cada llave y el caracter en nuestras variables auxiliares y finalmente devolveremos el caracter que haya tenido más ocurrencias.'o'f -> not 'o'bjects, 'i'n -> not 'i'terablesBasándonos en el algoritmo anterior para crear mapas de caracteres, podemos resolver el problema de determinar si dos palabras son anagramas.
Antes de ver este ejercicio, vamos a refactorizar nuestra función para poder reutilizarla haciendo referencia a ella:
const getCharMap = string1 => {
let map = {}
for (let char of string1) {
map[char] ? map[char]++ : map[char] = 1
}
return map
}
Adicionalmente crearemos una función para "sanitizar" o reemplazar espacios y caracteres especiales en una cadena, con objeto de tener un resultado correcto al momento de comparar dos cadenas:
const sanitizeString = dirtyStr => (
dirtyStr.toLowerCase().replace(/[^a-z\d]/g, '')
)
/[^a-z\d]/g para reemplazar las ocurrencias con el caracter vacío ''Ya que tenemos este par de funciones procederemos a resolver el problema de determinar si dos palabras son anagramas.
Un anagrama es una palabra o frase que resulta de la transposición de letras de otra palabra o frase. Dicho de otra forma, una palabra es anagrama de otra si las dos tienen las mismas letras, con el mismo número de apariciones, pero en un orden diferente.
Dadas dos cadenas, determinar si son anagramas retornando un valor booleano.
Se propone la siguiente solucion en JavaScript:
const areAnagrams = (string1, string2) => {
const string1Map = getCharMap(sanitizeString(string1))
const string2Map = getCharMap(sanitizeString(string2))
if (string1Map.length !== string2Map.length) return false
else {
for (let char in string1Map) {
if (string1Map[char] !== string2Map[char]) return false
}
return true
}
}
getCharMap y sanitizeString para limpiar las cadenas de caracteres especiales y generar su mapa de caracteresOtra propuesta de solución en la que no ocupamos mapa de caracteres (pero sí nuestra función para limpiar cadenas) es:
const anagrams = (stringA, stringB) => {
const cleanA = [...sanitizeString(stringA)].sort().join()
const cleanB = [...sanitizeString(stringB)].sort().join()
if (cleanA === cleanB) return true
else return false
}
sanitizeString() para limpiar nuestra cadena de caracteres especiales, en conjunto con el operador spread para convertir el resultado a arreglo; posteriormente usamos el método sort() para ordenar alfabéticamente el arreglo y posteriormente el método join() para convertir el arreglo a cadena.Escribir un programa que imrpima en pantalla los números de 1 a n. Para los números múltilplos de 3 en vez de imprimir el número imprimir la cadena
fizz; para los números múltilplos de 5 en vez de imprimir el número imprimir la cadenabuzz; finalmente para los números que sean múltiplos de ambos 3 y 5 imprimir la cadenafizzbuzz.
La propuesta de solución en JavaScript es la siguiente:
function fizzBuzz (n) {
for (let i = 1; i <= n; i++) {
if (i % 3 === 0 && i % 5 === 0) console.log('fizzbuzz')
else if (i % 3 === 0) console.log('fizz')
else if (i % 5 === 0) console.log('buzz')
else console.log(i)
}
}
fizzbuzzfizzbuzzDado un arreglo y un tamaño (chunk), dividir el arreglo en múltiples subarreglos donde cada subarreglo es de la longitud del tamaño (o chunk) especificado. Por ejemplo:
chunk([1, 2, 3, 4], 2) --> [[ 1, 2], [3, 4]]
chunk([1, 2, 3, 4, 5], 2) --> [[ 1, 2], [3, 4], [5]]
chunk([1, 2, 3, 4, 5, 6, 7, 8], 3) --> [[ 1, 2, 3], [4, 5, 6], [7, 8]]
chunk([1, 2, 3, 4, 5], 4) --> [[ 1, 2, 3, 4], [5]]
chunk([1, 2, 3, 4, 5], 10) --> [[ 1, 2, 3, 4, 5]]
Se proponen dos soluciones en JavaScript; la primera es:
function chunk (array, size) {
const chunked = []
for (let element of array) {
const last = chunked[chunked.length - 1]
if (!last || last.length === size) {
chunked.push([element])
} else {
last.push(element)
}
}
return chunked
}
array y el tamaño deseado de los subarreglos (o chunks) sizechunked donde almacenaremos nuestros subarreglos.last donde obtenendremos el último elemento del arreglo de subarreglos chunked y evaluamos:size:
chunked un nuevo subarreglo con el elemento actual del arreglo originallastOtra solución basada en el uso del método slice es:
const chunk = (array, size) => {
const chunked = []
let index = 0
while (index < array.length) {
chunked.push(array.slice(index, size + index))
index += size
}
return chunked
}
chunked donde almacenaremos nuestros subarreglos.index inicializada en 0index sea menor a la longitud del arreglo original:
chunked un subarreglo del original de longitud sizesize a index, controlando así la porción del subarreglo a insertar y el bucle whileEscribir una función que acepte una cadena. La función deberá convertir a mayúsculas la primer letra de cada palabra de dicha cadena y después regresar la cadena con las respectivas mayúsculas. Por ejemploL:
capitalize('a short sentence') --> 'A Short Sentence'
capitalize('a lazy fox') --> 'A Lazy Fox'
capitalize('look, it is working!') --> 'Look, It Is Working!'
La primer solución que obtuve fue:
function capitalize (str) {
let result = str[0].toUpperCase()
let rest = str.slice(1)
let space = rest.indexOf(' ')
while (space > -1) {
result += rest[space + 1].toUpperCase()
rest = rest.slice(space + 1)
space = rest.indexOf(' ')
}
return result + rest
}
result en la que almacenaremos el resultado y la inicializaamos con el primer caracter de la cadena convertido a mayúscula usando el método toUpperCase' ' dentro del resto de la cadenaresultOtra solución más legible es:
const capitalize = str => {
const words = []
for (let word of str.split(' ')) {
words.push(word[0].toUpperCase() + word.slice(1))
}
return words.join(' ')
}
words donde almacenaremos las palabras encontradas' ' obteniendo así cada palabra