如何获取字符串中最后一个单词的长度

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();
}

如果您选择循环,则无需反转字符串。您可以从最后一个索引开始迭代,确定 endstart 的值与 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"