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

本文介绍了LeetCode557题的解题思路,通过双指针技巧翻转字符串中的每个单词,同时保持空格和原始顺序。文章提供了详细的解题步骤、注意事项以及两种不同的代码实现,包括使用额外空间和StringBuilder的方法。
摘要由CSDN通过智能技术生成

一、前言

盲目刷题只会让自己心态爆炸,所以本期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();
    }
}

四、结语

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alita11101_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值