一、前言
盲目刷题只会让自己心态爆炸,所以本期14天算法学习计划,也是LeetCode上的 [算法]学习计划,在本专栏的每一篇文章都会整理每一天的题目并给出详细题解,以及知识点的整理
二、知识点
戳下方链接查看⬇⬇⬇
14天刷爆LeetCode算法学习计划——Day02双指针(1)
三、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(); } }
四、结语
本题是一道中档题,但是想明白解题思路以后其实核心还是字符串的反转问题,如果有更加简单的方法欢迎留言评论