代码随想录——反转字符串中的单词(Leetcode151)完全不会

题目链接
在这里插入图片描述

创建新字符数组填充。时间复杂度O(n)

class Solution {
    public String reverseWords(String s) {
        char arr[]=s.toCharArray();
        char newArr[] = new char[arr.length + 1];
        int newArrPos = 0;
        int i = arr.length - 1;
        // 对源字符串从后往前遍历
        while(i >= 0){
            while(i >= 0 && arr[i] == ' '){
                // 跳过空格
                i--;
            }
            // 此时i位置时边界或不为空格,记录当前索引
            int right = i;
            // 确定首个单词字母位置
            while(i >= 0 && arr[i] != ' '){
                i--;
            }
            // 指定区间单词取出,i时首字母前一位,取出每组末尾都带有一个空格
            for(int j = i + 1; j <= right; j++){
                newArr[newArrPos++] = arr[j];
                if(j == right){
                    newArr[newArrPos++] = ' ';
                }
            }
        }
        // 如果原始字符串没有单词则直接返回空字符串,又有单词返回0 - 末尾空格索引前范围的字符数组
        if(arr.length == 0){
            return s;
        }else{
            return new String(newArr, 0, newArrPos - 1);
        }
    }
}

双指针移除多余空格,将整个字符串反转,把单词逐个反转

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = trimSpaces(s);

        // 翻转字符串
        reverse(sb, 0, sb.length() - 1);

        // 翻转每个单词
        reverseEachWord(sb);

        return sb.toString();
    }

    public StringBuilder trimSpaces(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            ++left;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            --right;
        }

        // 将字符串间多余的空白字符去除
        StringBuilder sb = new StringBuilder();
        while (left <= right) {
            char c = s.charAt(left);

            if (c != ' ') {
                sb.append(c);
            } else if (sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }

            ++left;
        }
        return sb;
    }

    public void reverse(StringBuilder sb, int left, int right) {
        while (left < right) {
            char tmp = sb.charAt(left);
            sb.setCharAt(left++, sb.charAt(right));
            sb.setCharAt(right--, tmp);
        }
    }

    public void reverseEachWord(StringBuilder sb) {
        int n = sb.length();
        int start = 0, end = 0;

        while (start < n) {
            // 循环至单词的末尾
            while (end < n && sb.charAt(end) != ' ') {
                ++end;
            }
            // 翻转单词
            reverse(sb, start, end - 1);
            // 更新start,去找下一个单词
            start = end + 1;
            ++end;
        }
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/194450/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值