代码随想录-字符串-反转字符串中的单词

题目

题解

法一:纯粹为了做出本题,暴力解

没有技巧全是感情

class Solution {
    public String reverseWords(String s) {
        //首先去除首尾空格
        s = s.trim();
        String[] strs = s.split("\\s+");
        StringBuilder sb = new StringBuilder();
        //定义一个公共的字符反转方法
        for(int i=strs.length-1;i>=0;i--){
            sb.append(strs[i]).append(" ");
        }
        return sb.toString().trim();
    }
}

法二:推荐解

结合前面的刷题技巧

整体反转加内部单词反转

1、去除前后字符

2、反转整个字符串

3、反转每个单词

class Solution {
    /**
    可以借助之前的题目里的反转字符串的方法,char数组+双指针
     */
    public String reverseWords(String s) {
        char[] chars=s.toCharArray();
        //第一步,去除掉首尾和中间多余的空格
        chars = removeExtraSpaces(chars);
        //第二步,整个字符串反转
        reverse(chars,0,chars.length-1);
        //第三部,反转每个单词
        int start = 0;
        for(int i=0;i<=chars.length;i++){
            if(i== chars.length||chars[i]==' '){
                reverse(chars,start,i-1);
                start = i+1;
            }
        }
        return String.valueOf(chars);
    }

    public char[] removeExtraSpaces(char[] chars){
        //快慢指针来实现 原地将多余空格删除掉
        int slow = 0;
        for(int fast=0;fast<chars.length;fast++){
            if(chars[fast]!=' '){
                //在除了第一个单词外的每个单词前手动插入空格
                if(slow!=0){
                    chars[slow++]=' ';
                }
                while(fast<chars.length&&chars[fast]!=' '){
                    chars[slow++]=chars[fast++];
                }
            }
        }
        //将新的chars返回,[0,slow]
        char[] newChar = new char[slow];
        System.arraycopy(chars,0,newChar,0,slow);
        return newChar;
    }

    public void reverse(char[] chars,int low,int high){
        if(high>=chars.length){
            System.out.println("length out of index");
            return ;
        }
        while(low<high){
            char temp = chars[low];
            chars[low] = chars[high];
            chars[high] = temp;
            low++;
            high--; 
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值