如何获取字符串中最后一个单词的长度
How to obtain the length of the last word in the string
我已经反转了字符串,并且有一个 for 循环来遍历反转的字符串。
我正在计算字符数,我知道我有逻辑缺陷,但我无法确定我遇到此问题的原因。
解决方案需要return字符串中最后一个单词的长度。
我的第一个想法是向后迭代字符串(我不知道为什么我决定创建一个新字符串,我应该通过从字符串末尾递减我的 for 循环来迭代它)。
但是从那时起我的第二个 for 循环的逻辑应该是相同的。
我的逻辑基本上是尝试计算最后一个单词中不是空格的字符,然后当计数变量有值时,以及计数计算完最后一个字符后的下一个空格单词。
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;
}
}
也许试试这个,
public int lengthOfLastWord(String s) {
String [] arr = s.trim().split(" ");
return arr[arr.length-1].length();
}
首先,正如您所提到的,您形成的反向字符串只是原始字符串的副本。为了纠正这一点,
for (int i = s.length() - 1; i >= 0; i--) {
ch = s.charAt(i);
reversed += ch;
}
其次,第二个if条件在你的第一个if条件之内。这就是为什么它永远不会中断(因为您首先检查字符是否为空格,如果是,那么您不会进入 if 语句,因此您的内部 if 循环的第二个条件将永远不会满足)。
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
6
另一种方法是:使用内置函数 split,它 return 是一个字符串数组,然后是 return 数组中最后一个字符串的计数。
另一种选择是使用最后 space 的索引并从中计算长度:
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()
查找指定字符串最后一次出现的起始索引。 -1
表示未找到字符串,在这种情况下我们只有一个单词,整个字符串的长度就是我们所需要的。否则意味着我们有最后一个 space 的索引,我们可以使用 lastIndexInWord - lastSpaceIndex
.
计算最后一个词的长度
有很多方法可以实现。最有效的方法是确定最后一个白色space的索引后跟一个字母.
可以通过迭代给定字符串的索引来完成(提醒:String
在内部维护一个字节数组)或者简单地通过调用方法lastIndexOf()
.
请记住,在运行时可能遇到的字符串长度限制为 Integer.MAX_VALUE
,它不会是 performance-wise在内存中分配 array 的解决方案,这是由于拆分这个冗长的字符串而产生的,当只需要单个元素的 长度 时。
下面的代码演示了如何使用 Stream IPA 和通常的 for
循环来解决这个问题。
流的逻辑:
- 创建一个
IntStream
从最后一个开始迭代给定字符串的索引。
- 丢弃字符串末尾的所有 non-alphabetic 符号
dropWhile()
。
- 然后使用
takeWhile()
. 保留所有字母直到遇到第一个non-alphabetic符号
- 获取流中元素的计数。
Stream-based解法:
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();
}
如果您选择循环,则无需反转字符串。您可以从最后一个索引开始迭代,确定 end
和 start
的值与 return 的差异。
以防万一,如果需要反转一个字符串最简单有效的方法:
new StringBuilder(source).reverse().toString();
迭代解:
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;
}
main()
public static void main(String[] args) {
System.out.println(getLastWord("Humpty Dumpty sat on a wall % _ (&)"));
}
输出
4 - last word is "wall"
我已经反转了字符串,并且有一个 for 循环来遍历反转的字符串。
我正在计算字符数,我知道我有逻辑缺陷,但我无法确定我遇到此问题的原因。
解决方案需要return字符串中最后一个单词的长度。
我的第一个想法是向后迭代字符串(我不知道为什么我决定创建一个新字符串,我应该通过从字符串末尾递减我的 for 循环来迭代它)。
但是从那时起我的第二个 for 循环的逻辑应该是相同的。
我的逻辑基本上是尝试计算最后一个单词中不是空格的字符,然后当计数变量有值时,以及计数计算完最后一个字符后的下一个空格单词。
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;
}
}
也许试试这个,
public int lengthOfLastWord(String s) {
String [] arr = s.trim().split(" ");
return arr[arr.length-1].length();
}
首先,正如您所提到的,您形成的反向字符串只是原始字符串的副本。为了纠正这一点,
for (int i = s.length() - 1; i >= 0; i--) {
ch = s.charAt(i);
reversed += ch;
}
其次,第二个if条件在你的第一个if条件之内。这就是为什么它永远不会中断(因为您首先检查字符是否为空格,如果是,那么您不会进入 if 语句,因此您的内部 if 循环的第二个条件将永远不会满足)。
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
6
另一种方法是:使用内置函数 split,它 return 是一个字符串数组,然后是 return 数组中最后一个字符串的计数。
另一种选择是使用最后 space 的索引并从中计算长度:
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()
查找指定字符串最后一次出现的起始索引。 -1
表示未找到字符串,在这种情况下我们只有一个单词,整个字符串的长度就是我们所需要的。否则意味着我们有最后一个 space 的索引,我们可以使用 lastIndexInWord - lastSpaceIndex
.
有很多方法可以实现。最有效的方法是确定最后一个白色space的索引后跟一个字母.
可以通过迭代给定字符串的索引来完成(提醒:String
在内部维护一个字节数组)或者简单地通过调用方法lastIndexOf()
.
请记住,在运行时可能遇到的字符串长度限制为 Integer.MAX_VALUE
,它不会是 performance-wise在内存中分配 array 的解决方案,这是由于拆分这个冗长的字符串而产生的,当只需要单个元素的 长度 时。
下面的代码演示了如何使用 Stream IPA 和通常的 for
循环来解决这个问题。
流的逻辑:
- 创建一个
IntStream
从最后一个开始迭代给定字符串的索引。 - 丢弃字符串末尾的所有 non-alphabetic 符号
dropWhile()
。 - 然后使用
takeWhile()
. 保留所有字母直到遇到第一个non-alphabetic符号
- 获取流中元素的计数。
Stream-based解法:
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();
}
如果您选择循环,则无需反转字符串。您可以从最后一个索引开始迭代,确定 end
和 start
的值与 return 的差异。
以防万一,如果需要反转一个字符串最简单有效的方法:
new StringBuilder(source).reverse().toString();
迭代解:
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;
}
main()
public static void main(String[] args) {
System.out.println(getLastWord("Humpty Dumpty sat on a wall % _ (&)"));
}
输出
4 - last word is "wall"