14天刷爆LeetCode算法学习计划——Day04 双指针(2)

Day04——双指针

  • 一、前言
  • 二、知识点
  • 三、LeetCode557. 反转字符串中的单词 III
    • 1.题目
    • 2.解题思路
    • 3.注意事项
    • 4.代码实现
    • 5.验证代码
    • 6.其它解法(来自力扣)
      • 1️⃣使用额外空间
      • 2️⃣借助StringBulider
  • 四、结语

一、前言

盲目刷题只会让自己心态爆炸,所以本期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
14天刷爆LeetCode算法学习计划——Day04 双指针(2)_第1张图片

然后重新定义新的双指针,遍历数组遇到空格,即 array[i] == ’ ’ 时,改变头指针为i+1,再判断是否会遇到下一个空格,如果遇到,重复上面的步骤、反转,如果没有遇到,即遍历数组至末尾没有遇见空格时:i = array.length - 1,**修改尾指针为 i **反转单词
14天刷爆LeetCode算法学习计划——Day04 双指针(2)_第2张图片

此时就完成了题目要求的字符串的反转
14天刷爆LeetCode算法学习计划——Day04 双指针(2)_第3张图片

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.验证代码

14天刷爆LeetCode算法学习计划——Day04 双指针(2)_第4张图片

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();
    }
}

四、结语

本题是一道中档题,但是想明白解题思路以后其实核心还是字符串的反转问题,如果有更加简单的方法欢迎留言评论

你可能感兴趣的:(LeetCode,算法,leetcode,学习)