He invertido la cadena y tengo un ciclo for para iterar a través de la cadena invertida.
Estoy contando caracteres y sé que tengo una falla lógica, pero no puedo determinar por qué tengo este problema.
La solución debe devolver la longitud de la última palabra de la cadena.
Mi primer pensamiento fue iterar a través de la cadena hacia atrás (no sé por qué decidí crear una nueva cadena, debería haberla iterado disminuyendo mi bucle for desde el final de la cadena).
Pero la lógica debería ser la misma desde ese punto para mi segundo ciclo for.
Mi lógica es básicamente tratar de contar los caracteres que no son espacios en blanco en la última palabra, y luego, cuando la variable de conteo tiene un valor, así como el siguiente espacio en blanco después de que el conteo haya contado los caracteres de la última palabra.
class Solution { public int lengthOfLastWord(String s) { int count = 0; int countWhite = 0; char ch; String reversed = ""; for(int i = 0; i < s.length(); i++) { ch = s.charAt(i); reversed += ch; } for(int i = 0; i < reversed.length(); i++) { if(!Character.isWhitespace(reversed.charAt(i))) { count++; if(count > 1 && Character.isWhitespace(reversed.charAt(i)) == true) { break; } } } return count; } }Tal vez intente esto,
public int lengthOfLastWord(String s) { String [] arr = s.trim().split(" "); return arr[arr.length-1].length(); }En primer lugar, como ha mencionado, su cadena inversa formada es solo una copia de su cadena original. Para rectificar eso,
for (int i = s.length() - 1; i >= 0; i--) { ch = s.charAt(i); reversed += ch; }En segundo lugar, la segunda condición if está dentro de su primera condición if. Es por eso que nunca se romperá (porque primero está verificando si el carácter es un espacio en blanco, si lo es, entonces no va a entrar en la declaración if, por lo tanto, su segunda condición de su bucle if interno nunca se cumplirá).
public class HW5 { public static void main(String[] args) { String s = "My name is Mathew"; int count = lengthOfLastWord(s); System.out.println(count); } public static int lengthOfLastWord(String s) { int count = 0; int countWhite = 0; char ch; String reversed = ""; System.out.println("original string is----" + s); for (int i = s.length() - 1; i >= 0; i--) { ch = s.charAt(i); reversed += ch; } System.out.println("reversed string is----" + reversed); for (int i = 0; i < reversed.length(); i++) { if (!Character.isWhitespace(reversed.charAt(i))) count++; if (count > 1 && Character.isWhitespace(reversed.charAt(i)) == true) { break; } } return count; } }=
and the output is : original string is----My name is Mathew reversed string is----wehtaM si eman yM 6Otra forma de hacerlo es: usa la función incorporada dividir que devuelve una matriz de cadena y luego devuelve el recuento de la última cadena en la matriz.
Otra opción sería usar el índice del último espacio y calcular la longitud a partir de él:
public int lengthOfLastWord(String string) { int whiteSpaceIndex = string.lastIndexOf(" "); if (whiteSpaceIndex == -1) { return string.length(); } int lastIndex = string.length() - 1; return lastIndex - whiteSpaceIndex; } String.lastIndexOf() encuentra el índice de inicio de la última aparición de la cadena especificada. -1 significa que no se encontró la cadena, en cuyo caso tenemos una sola palabra y la longitud de la cadena completa es lo que necesitamos. De lo contrario, significa que tenemos el índice del último espacio y podemos calcular la longitud de la última palabra usando lastIndexInWord - lastSpaceIndex .
Hay muchas maneras de lograrlo. El enfoque más eficiente es determinar el índice del último espacio en blanco seguido de una letra .
Se puede hacer iterando sobre los índices de la cadena dada ( recordatorio: String mantiene una matriz de bytes internamente ) o simplemente invocando el método lastIndexOf() .
Teniendo en cuenta que la longitud de una cadena que se puede encontrar en el tiempo de ejecución está limitada a Integer.MAX_VALUE , no será una solución inteligente para el rendimiento asignar en la memoria una matriz , producida como resultado de la división de esta larga cadena, cuando solo se requiere la longitud de un solo elemento .
El siguiente código demuestra cómo abordar este problema con Stream IPA y un bucle for habitual.
La lógica de la corriente:
IntStream que itere sobre los índices de la cadena dada, comenzando desde el último.dropWhile() .takeWhile() .Solución basada en flujo:
public static int getLastWordLength(String source) { return (int) IntStream.iterate(source.length() - 1, i -> i >= 0, i -> --i) .map(source::charAt) .dropWhile(ch -> !Character.isLetter(ch)) .takeWhile(Character::isLetter) .count(); } Si su elección es un bucle , no es necesario invertir la cadena. Puede iniciar la iteración desde el último índice, determinar los valores del end y start y devolver la diferencia.
Por si acaso , si necesita invertir una cadena, esa es la forma más simple y eficiente:
new StringBuilder(source).reverse().toString();Solución iterativa:
public static int getLastWordLength(String source) { int end = -1; // initialized with illegal index int start = 0; for (int i = source.length() - 1; i >= 0; i--) { if (Character.isLetter(source.charAt(i)) && end == -1) { end = i; } if (Character.isWhitespace(source.charAt(i)) && end != -1) { start = i; break; } } return end == -1 ? 0 : end - start; }principal()
public static void main(String[] args) { System.out.println(getLastWord("Humpty Dumpty sat on a wall % _ (&)")); }producción
4 - last word is "wall"