代码随想录算法训练营第八天| LeetCode344.反转字符串、LeetCode541. 反转字符串II、LeetCode151.翻转字符串里的单词

本文介绍了如何使用双指针和StringBuilder/StringBuffer类在LeetCode中的两个字符串反转问题(344和541)中进行高效操作,以及如何处理151题中反转单词和去除多余空格的问题。
摘要由CSDN通过智能技术生成

#LeetCode 344. Reverse String

双指针操作,比较简单。

class Solution {
    public void reverseString(char[] s) {
        if (s.length == 0) {
            return;
        }
        for (int i = 0, j = s.length - 1; i < s.length / 2; i++, j--) {
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }
        return;
    }
}

#LeetCode 541. Reverse String II

#LeetCode 541. 视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili

如果需要多次更改字符串的内容,一般使用StringBuilder 或 StringBuffer 类,所以本题可以用StringBuffer 建立一个新的字符串,用append 拼接的方式,这个方法细节较多。还可以考虑将字符串更改为数组,然后遍历的方式。

考虑的点在以2*k 为单位移动,每次操作的反转的字符串是前k 个。在分离出的2*k 个元素中,使用双指针法交换对应元素。如果剩余元素不足k 个,则end 指针指向数组最后一个元素。除了使用异或方法,还可以使用temp 临时变量更换两个元素。

遍历数组➕异或方法:

class Solution {
    public String reverseStr(String s, int k) {
        char[] result = s.toCharArray();
        for(int i = 0; i < result.length; i += 2 * k) {
            int start = i;
            int end = Math.min(start + k - 1, result.length - 1);
            while (start < end) {
                result[start] ^= result[end];
                result[end] ^= result[start];
                result[start] ^= result[end];
                start++;
                end--;
            }
        }
        return new String(result);
    }
}

#LeetCode 151. Reverse Words in a String

 #LeetCode 151. 视频讲解:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili

解题思路:首先去除字符串中多余的空格 --> 翻转整个字符串 --> 翻转单词。

去除空格:双指针方法,如果快指针指向非空字符,慢指针不为0 ,则表示这是一个新单词,需要首先添加空格,当快指针没有超出字符串长度以及没有遇到空格时,持续更新在慢指针指向的位置中。最后需要用arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 将新数组复制出来保存,因为新数组与旧数组长度不同了,但数组长度在建立数组时已经设定,所以复制到新的数组中。

翻转数组 / 单词:使用三个参数,分别是:需要转换的数组,起始位置,终止位置(输入的终止位置不可以超过数组长度)。交换方法类似344 题,在翻转单词时,如果i 遍历到了数组尾部或者遇到了空格,即识别到了单词,开始交换。

字符串转换为数组方法: 空间复杂度O(1).

class Solution {
    public String reverseWords(String s) {
        char[] result = removeSpace(s);
        reverseString(result, 0, result.length - 1);
        reverseWord(result);
        return new String(result);
    }
    public char[] removeSpace(String s) {
        char[] string = s.toCharArray();
        int fast = 0;
        int slow = 0;
        for (fast = 0; fast < string.length; fast++) {
            if (string[fast] != ' ') {
                if (slow != 0) {
                    string[slow++] = ' ';
                }
                while (fast < string.length && string[fast] != ' ') {
                    string[slow++] = string[fast++];
                }
            }
        }
        char[] newChars = new char[slow];
        System.arraycopy(string, 0, newChars, 0, slow); 
        return newChars;
    }
    public void reverseString(char[] c, int left, int right) {
        if (right >= c.length) {
            return;
        }
        while (left < right) {
            c[left] ^= c[right];
            c[right] ^= c[left];
            c[left] ^= c[right];
            left++;
            right--;
        }
    }
    public void reverseWord(char[] c) {
        int start = 0;
        for (int i = 0; i <= c.length; i++) {
            if (i == c.length || c[i] == ' ') {
                reverseString(c, start, i - 1);
                start = i + 1;
            }
        }
    }
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值