Day04——双指针
一、前言
盲目刷题只会让自己心态爆炸,所以本期14天算法学习计划,也是LeetCode上的 [算法]学习计划,在本专栏的每一篇文章都会整理每一天的题目并给出详细题解,以及知识点的整理
二、知识点
戳下方链接查看⬇⬇⬇
三、LeetCode557. 反转字符串中的单词 III
1.题目
LeetCode557. 反转字符串中的单词III
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
示例 2:
输入: s = “God Ding”
输出:“doG gniD”
2.解题思路
这道题与上一题的字符串反转不一样的是:现在是一个句子,当中会有空格,那么我们可以把空格当作是一个分界线,当遍历数组遇到空格时,先反转空格前的单词,即array[i] == ’ ’ 时,头指针为0,尾指针为 i - 1
然后重新定义新的双指针,遍历数组遇到空格,即 array[i] == ’ ’ 时,改变头指针为i+1,再判断是否会遇到下一个空格,如果遇到,重复上面的步骤、反转,如果没有遇到,即遍历数组至末尾没有遇见空格时:i = array.length - 1,**修改尾指针为 i **反转单词
此时就完成了题目要求的字符串的反转
3.注意事项
-
要先把字符串转换成字符数组才可以拆分成每个字母,进行反转
-
当我们设定临时变量temp的时候,其 变量类型为char型,因为本题要求反转字符串
-
本题的返回值是字符串,故返回值类型是String型
4.代码实现
class Solution {
public String reverseWords(String s) {
//把字符串转换成字符数组
char[] array = s.toCharArray();
//定义左指针
int left= 0;
for (int i = 0; i < array.length; i++) {
//判断是否遇到空格
if (array[i] == ' ') {
reverse(array, left, i - 1);
left = i + 1; // 将左指针变为下一个单词的左索引
continue;
}
if (i == array.length - 1) {
reverse(array, left, i);
}
}
//返回字符串
return new String(array);
}
//定义方法实现反转
private void reverse(char[] array, int i, int j) {
while (i < j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
i ++;
j --;
}
}
}
5.验证代码
6.其它解法(来自力扣)
1️⃣使用额外空间
class Solution {
public String reverseWords(String s) {
StringBuffer ret = new StringBuffer();
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s.charAt(i) != ' ') {
i++;
}
for (int p = start; p < i; p++) {
ret.append(s.charAt(start + i - 1 - p));
}
while (i < length && s.charAt(i) == ' ') {
i++;
ret.append(' ');
}
}
return ret.toString();
}
}
2️⃣借助StringBulider
class Solution {
public String reverseWords(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0, j = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch != ' ') {
sb.insert(j, ch);
} else {
j = i + 1;
sb.append(ch);
}
}
return sb.toString();
}
}
四、结语
本题是一道中档题,但是想明白解题思路以后其实核心还是字符串的反转问题,如果有更加简单的方法欢迎留言评论