题解 | #翻转单词序列#
翻转单词序列
https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3
public class Solution {
public String ReverseSentence(String str) {
if (str == null) return "";
char[] chars = str.toCharArray();
// 消除多余的空格
// 字符串最终的有效长度
int len = 0;
// 当前用来存放字符的位置
int cur = 0;
// 前一个字符是否为空格字符
boolean space = true;
for (int i = 0; i < chars.length; i++) {
if (chars[i] != ' ') { // chars[i]是非空格字符
chars[cur++] = chars[i];
space = false;
} else if (space ==
false) { // chars[i]是空格字符,chars[i - 1]是非空格字符
chars[cur++] = ' ';
space = true;
}
}
len = space ? (cur - 1) : cur;
if (len <= 0) return "";
// 对整一个有效字符串进行逆序
reverse(chars, 0, len);
// 对每一个单词进行逆序
// 前一个空格字符的位置(有-1位置有个假想的哨兵,就是一个假想的空格字符)
int prevSapceIdx = -1;
for (int i = 0; i < len; i++) {
if (chars[i] != ' ') continue;
reverse(chars, prevSapceIdx + 1, i);
prevSapceIdx = i;
}
// 翻转最后一个单词
reverse(chars, prevSapceIdx + 1, len);
return new String(chars, 0, len);
}
/**
* 将[li, ri)范围内的字符串进行逆序
*/
private static void reverse(char[] chars, int li, int ri) {
ri--;
while (li < ri) {
// 左右字符交换
char tmp = chars[li];
chars[li] = chars[ri];
chars[ri] = tmp;
li++;
ri--;
}
}
}
解题思想:
* 方式一:java-api
* 方式二:借助栈
* 方式三:原生方法
#算法##算法笔记#
查看5道真题和解析