目录
题目地址:
今天刷字符串中的单词反转(反转单词序列),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
解题方法:
第一个方法双指针,
第二个方法分割+倒序。
审题目+事例+提示:
·message可能前后有空格,或者单词之间存在多个空格,
但返回数组只能单词之间只有一个空格
·未说不可原地更改数组
思路(双指针):
- 倒序遍历数组,创建双指针,i、j均指向数组尾部,创建StringBuilder
- 每确定一个单词左右边界,就添加到res中
- 拼接字符列表,返回转成字符串,再取出首尾空格 。
代码实现:
class Solution {
public String reverseMessage(String message) {
//使用trim()方法删去首尾格
message = message.trim();
//两个指针均指向数组尾部
int j = message.length() - 1, i = j;
//创建新字符串StringBuilder()
StringBuilder res = new StringBuilder();
while (i >= 0) {
// 搜索空格,并逐个空格跳过
while (i >= 0 && message.charAt(i) != ' ') i--;
// 利用subStirng()截取对应单词,利用append()方法添加单词
res.append(message.substring(i + 1, j + 1) + " ");
while (i >= 0 && message.charAt(i) == ' ') i--; // 跳过单词间空格
j = i; // j 指向下个单词的尾字符
}
return res.toString().trim(); // 转化为字符串,去调首尾空格并返回
}
}
代码(方法2):
class Solution {
public String reverseMessage(String message) {
String[] strs = message.trim().split(" "); // 删除首尾空格,分割字符串
StringBuilder res = new StringBuilder();
for (int i = strs.length - 1; i >= 0; i--) { // 倒序遍历单词列表
if(strs[i].equals("")) continue; // 遇到空单词则跳过
res.append(strs[i] + " "); // 将单词拼接至 StringBuilder
}
return res.toString().trim(); // 转化为字符串,删除尾部空格,并返回
}
}