【每日一题】【去除多余空格】【字符串修改】2021年12月21日-151. 翻转字符串里的单词

给你一个字符串 s ,逐个翻转字符串中的所有 单词 。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。

说明:

输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 方法:库函数or手写

//库函数Collections.reverse数组,String.join(" ", words);

//反转所有,反转单词,去除空格s.trim()
class Solution {
    public String reverseWords(String s) {
        String[] arr = s.trim().split(" +"); //正则表达式
        Collections.reverse(Arrays.asList(arr));
        return String.join(" ", arr);
    }
}

//手写方法,注意:变动字符串元素,需要传递字符数组,并且无返回值!
class Solution {
    public String reverseWords(String s) {
        if(s.length() == 0 || s == null) {
            return s;
        }
        //整体反转
        char[] arr = s.toCharArray();
        reverse(arr, 0, arr.length - 1);
        //每个单词反转,☆
        reverseWord(arr);
        //移除多余空格
        return replace(arr);
    }
    /**
     整体反转
     */
    public void reverse(char[] arr, int m, int n) {
        //注意循环条件
        while(m < n) {
            arr[m] ^= arr[n];
            arr[n] ^= arr[m];
            arr[m] ^= arr[n];
            m++;
            n--;
        }
    }
    /**
     每个单词反转
     */
    public void reverseWord(char[] arr) {
        int n = arr.length;
        int i = 0, j = 0;
        while(j < n) {
            while(i < n && arr[i] == ' ') {
                i++;
            }
            j = i;//注意移动j的位置
            while(j < n && arr[j] != ' ') {
                j++;
            }
            reverse(arr, i, j - 1);
            i = j; //注意:最后要改变i的值
        }
    }
    /**
     移除多余空格,☆
     类似于双指针
     */
    public String replace(char[] arr) {
        int n = arr.length;
        int i = 0, j = 0;
        while(j < n) {
            while(j < n && arr[j] == ' ') {
                j++;
            }
            while(j < n && arr[j] != ' ') {
                arr[i++] = arr[j++];
            }
            while(j < n && arr[j] == ' ') {
                j++;
            }
            //注意最后加空格
            if(j < n) {
                arr[i++] = ' ';
            }
        }
        return new String(arr).substring(0, i);//注意:不再是原来的数组
    }
}

 

posted @ 2021-12-21 20:57  哥们要飞  阅读(120)  评论(0)    收藏  举报