La tarea era escribir una función subLength() que toma 2 parámetros, una cadena y un solo carácter. La función debe buscar en la cadena las dos apariciones del carácter y devolver la longitud entre ellas, incluidos los 2 caracteres. Si hay menos de 2 o más de 2 ocurrencias del carácter, la función debería devolver 0.
const subLength = (str, char) => { let charCount = 0; let len = -1; for (let i=0; i<str.length; i++) { if (str[i] == char) { charCount++; if (charCount > 2) { return 0; } // could somebody explain why -1 is equal to len and then len is reassigned to i??? if (len == -1) { len = i; } else { len = i - len + 1 } } } if (charCount < 2) { return 0; } return len; };
en la primera aparición len= -1 entonces: (len ==-1) se convirtió en verdadero; y len se cambia a i entonces len=i; en la segunda ocurrencia len no es -1 entonces:
len = i - len -1;
en esencia, en la expresión anterior, len mantiene el índice de la primera ocurrencia, e i tiene el índice de la segunda ocurrencia, por lo que la diferencia será, la diferencia entre dos ocurrencias, 'qweraq': primera ocurrencia: 0, segunda: 6 .6-0-1= 5 es diferencia;
Así es como me las arreglo para reescribir su código. Espero que esto ayude.
const subLength = (str, char) => { const arr = str.split(''); let count = 0; arr.forEach(letter => letter === char ? count++ : '') const result = arr.some(letter => { if (arr.indexOf(char) !== arr.lastIndexOf(char) && count == 2) { return true } return false }) return result ? Math.abs(arr.indexOf(char) - arr.lastIndexOf(char)) + 1 : 0 }
Si bien es posible calcular los índices y el conteo dentro de un solo bucle, dada la trivialidad, preferiría los métodos API estándar para escanear. siempre se puede optimizar más tarde si la aplicación realmente lo requiere.
Primero, convertimos la cadena en una matriz para que podamos filtrar las coincidencias con el carácter de entrada y derivar la longitud.
Solo si hay 2 ocurrencias, calculamos la distancia entre el uso de los métodos indexOf
y lastIndexOf
en la cadena (tenga en cuenta que estos solo requerirán un segundo escaneo completo de la cadena si las dos ocurrencias son consecutivas).
De lo contrario, el resultado debería ser 0.
const subLength = (str, chr) => { const count = str.split('').filter(ltr => ltr === chr).length if (count === 2) { return (str.lastIndexOf(chr) - str.indexOf(chr)) + 1 } return 0 } console.log(subLength('asddfghvcba', 'a')) console.log(subLength('asddfghvcba', 'x')) console.log(subLength('aaaaaaaaaaa', 'a'))