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

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

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

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

【字符串】【双指针翻转字符串+快慢指针】Leetcode 151 反转字符串中单词【好】_第1张图片

解法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);
    }
}   

你可能感兴趣的:(Leetcode,leetcode,算法,职场和发展,1024程序员节,java)