58Ⅰ.翻转单词顺序
大约 1 分钟
58Ⅰ.翻转单词顺序
参考链接
剑指 Offer 58 – I. 翻转单词顺序-跟着帅地玩转校招,刷爆各类算法题帅地玩Offer
LCR 181. 字符串中的单词反转 - 力扣(LeetCode)
个人尝试
先翻转整个句子,再翻转单个单词
class Solution {
public String reverseMessage(String message) {
char[] msg = message.trim().toCharArray();
char tmp;
int i = 0;
int j = msg.length - 1;
while (i <= j) {
tmp = msg[i];
msg[i] = msg[j];
msg[j] = tmp;
i++;
j--;
}
i = 0; j = 0;
int k = 0;
while (j < msg.length) {
while (msg[j] == ' ') j++;
while (j < msg.length && msg[j] != ' ') j++;
// 借助 k 来交换位置,因为 j 的值需要保持不变
k = j - 1;
// 两者皆为空格时,不交换
while (i < k && !(msg[i] == ' ' && msg[k] == ' ')) {
tmp = msg[i];
msg[i] = msg[k];
msg[k] = tmp;
i++;
k--;
}
// 跳过一个空格
// 可改成
// while (i < msg.length && msg[i] != ' ') i++;
// i++;
while (i < msg.length && msg[i++] != ' ');
}
return String.valueOf(msg).trim();
}
}
优秀题解
class Solution {
public String reverseMessage(String message) {
message = message.trim(); // 删除首尾空格
int j = message.length() - 1, i = j;
StringBuilder res = new StringBuilder();
while (i >= 0) {
while (i >= 0 && message.charAt(i) != ' ') i--; // 搜索首个空格
res.append(message.substring(i + 1, j + 1) + " "); // 添加单词
while (i >= 0 && message.charAt(i) == ' ') i--; // 跳过单词间空格
j = i; // j 指向下个单词的尾字符
}
return res.toString().trim(); // 转化为字符串并返回
}
}
作者:Krahets
链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/solutions/195224/mian-shi-ti-58-i-fan-zhuan-dan-ci-shun-xu-shuang-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。