★【字符串】【双指针翻转字符串+快慢指针】【split】Leetcode 151 反转字符串中单词

【字符串】【双指针翻转字符串+快慢指针+split】Leetcode 151 反转字符串中单词

---------------🎈🎈题目链接🎈🎈-------------------
---------------🎈🎈解答链接🎈🎈-------------------

在这里插入图片描述

解法1 双指针翻转字符串+快慢指针+更新数组大小

1.翻转全部
2.删除空格(快慢指针) 这部分蛮难思考的

  • 当slow不是0(为了排除最前面的一个(一堆)空格)时
    且ch[fast]不是空格,ch[fast-1]是空格的时候————表示一个单词结束,另一个单词开始,此时给slow加空格再进行赋值
  • ch[fast]不是空格——不断遍历单词的时候,只需要把fast的值赋给slow即可
  • 剩下的就是ch[fast]是空格的时候,那就不操作直接fast++

3.翻转单词

更新数组:char[] newch = Arrays.copyOf(ch, 4);

时间复杂度O(N)

  • 翻转全部字符的操作需要遍历整个字符串,时间复杂度为O(n),其中n是字符串的长度。
  • 删除空格的操作也需要遍历整个字符串,时间复杂度为O(n)。
  • 翻转单词的操作需要遍历整个字符串,时间复杂度为O(n)。

空间复杂度O(N)

  • 使用了一个字符数组ch来存储字符串的字符,空间复杂度为O(n),其中n是字符串的长度。
  • 使用了一个新的字符数组newch来存储删除空格后的字符,空间复杂度为O(n)。
  • 没有使用额外的空间,所以除了字符数组外,空间复杂度为O(1)。
class Solution {
    public String reverseWords(String s) {
class Solution {
    public String reverseWords(String s) {
        // 1.翻转全部
        // 2.删除空格
        // 3.翻转单词
        char[] ch = s.toCharArray();

        // 1.翻转全部
        int left = 0;
        int right = ch.length-1;
        while(left < right){
            ch[left] ^= ch[right];
            ch[right] ^= ch[left];
            ch[left] ^= ch[right];
            left++;
            right--;
        }

        // 2.删除空格(快慢指针) 更新数组
        // 慢指针不为0,快指针指向空格 直至遇到下一个字母后 ch[slow++] =' '

        int slow = 0;
        int fast = 0;
        for(; fast < ch.length; fast++){

            // 当slow不是0(为了排除最前面的一个(一堆)空格)时,
            // 且ch[fast]不是空格,ch[fast-1]是空格的时候————表示一个单词结束,另一个单词开始,此时给slow加空格再进行赋值
            if(slow != 0 && ch[fast] != ' ' && ch[fast-1] == ' '){ 
                ch[slow++] = ' ';
                ch[slow++] = ch[fast];
            } 
            // ch[fast]不是空格——不断遍历单词的时候,只需要把fast的值赋给slow即可
            else if(ch[fast] != ' '){
                ch[slow++] = ch[fast];
            }

            // 剩下的就是ch[fast]是空格的时候,那就不操作直接fast++
        }

        char[] newch = Arrays.copyOf(ch, slow); // 更新数组


        // 3.翻转单词
        int left2 = 0;
        for(int i = 0; i <= newch.length; i++){
            if(i == newch.length || newch[i] == ' ' ){
                int right2 = i-1;
                while(left2 < right2){
                    newch[left2] ^= newch[right2];
                    newch[right2] ^= newch[left2];
                    newch[left2] ^= newch[right2];
                    left2++;
                    right2--;
                }
                left2 = i+1;
            }
        }
        return new String(newch);
    }
}   

解法2 结合StringBuilder和s.split(“ ”,-1)

或者还有方法就是结合StringBuilder和split(“ ”,-1)
String[] temp = s.split(“ ”,-1)
之后倒叙遍历temp到StringBuilder中,即可完成单词的倒叙排列,还可以把空格去掉!!

class Solution {
    public String reverseWords(String s) {
        // 去掉首尾的空格
        char[] ch = s.toCharArray();
        int left = 0;
        while(ch[left]==' '){
            left++;
        }
        int right = ch.length-1;
        while(ch[right] ==' '){
            right--;
        }
        ch = Arrays.copyOfRange(ch,left,right+1);
        s = new String(ch);

        //使用split分割,之后倒叙遍历到StringBulider中 ,最后toString转化为String输出
        StringBuilder result = new StringBuilder();
        String[] temp = s.split(" ");
        System.out.println(temp.length);
        for(int i = temp.length-1; i >=0; i--){
            if(temp[i].equals("")) continue;
            result.append(temp[i]);
            if(i == 0) break;
            result.append(" ");

        }
        return result.toString();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值