题目:https://leetcode-cn.com/problems/reverse-words-in-a-string/
自己的思路:使用两个指针,i 指针负责从后向前遍历整个字符串,j 指针找到单词的末尾字符,单词开头的特点是:空格+字符(字符串的开头添加一个空格);单词末尾的特点:字符+空格/字符;
java代码:
public static String reverseWords(String s) { StringBuilder str = new StringBuilder(); s = " "+s;//字符串的开头添加一个空格 for (int i = s.length() - 1, j = s.length() - 1; i >= 1; i--){ if (s.charAt(i - 1) != ' ' && s.charAt(i) == ' '){//如果 i 所指位置为空,前一位不为空,则说明前一位为单词的结尾,将 j 指向此处; j = i-1; } if (s.charAt(i - 1) == ' ' && s.charAt(i) != ' ') {//如果 i 所指位置不为空,前一位为空,则说明找到了该单词的开头,截取头和尾之间的字符串即为一个单词,并在单词后添加一个空格。 String temp = s.substring(i, j+1); str.append(temp+" "); } } str.deleteCharAt(str.length()-1);//去除末尾多余的一个空格 return str.toString(); }
知识点:java.lang.StringBuffer.deleteCharAt() 在这个序列中的指定位置删除字符。
效果:
官方:
别人的解答:不要使用辅助空间,空间复杂度要求为O(1)。https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html#%E5%85%B6%E4%BB%96%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC
思路:移除多余空格、将整个字符串反转、将每个单词反转