LeetCode - 151. Reverse Words in a String

第一种方法是使用Java的内置方法,非常巧妙,代码如下:

public class Solution {
    public String reverseWords(String s) {
        if(s == null || s.length() == 0) return s;
        
        String[] words = s.trim().split(" +");
        Collections.reverse(Arrays.asList(words));
        return String.join(" ", words);
    }
}

第二种方法不使用Java内置方法,这种方法总的来说分三步:第一步是翻转整个array,第二步是翻转array中的所有word,第三步是清除array中的空格。大思路确定之后,我们可以思考怎样实现这三步。

第一步的话,我们可以另外写一个reverse array的函数实现,着是一个基础的方法,要记住。

第二步的话,我们使用两个指针逐个扫描char[] array,i指针跳过空格或者i < j,j指针跳过字母或者j < i,然后reverse(array, i, j - 1),这样就反转了其中的一个单词。在i < n的条件下重复上面的过程,这样我们就翻转了所有的单词。

第三步我们同样使用两个指针,j指针用于跳过空格,而i指针开始的时候指向开头,用于将j指向的字母移动到i的位置,这个方法有些繁杂,要考虑多种情况,需要多看看多体会。

整体的代码如下:

public class Solution {
    public String reverseWords(String s) {
        if(s == null || s.length() == 0) return s;
        
        char[] arr = s.toCharArray();
        int n = arr.length;
        
        // Step 1. Reverse whole array
        reverse(arr, 0, n - 1);
        // Step 2. Reverse each word
        reverseEachWord(arr, n);
        // Step 3. Clean spaces
        return cleanSpaces(arr, n);
    }
    
    private String cleanSpaces(char[] arr, int n){
        int i = 0;
        int 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);
    }
    
    private void reverseEachWord(char[] arr, int n){
        int i = 0;      // pointer to jump spaces
        int j = 0;      // pointer to jump non-spaces
        
        while(i < n){
            while(i < j || (i < n && arr[i] == ' ')) i++;       // jump spaces
            while(j < i || (j < n && arr[j] != ' ')) j++;       // jump non-spaces
            reverse(arr, i, j - 1);     // reverse word
        }
    }
    
    private void reverse(char[] arr, int i, int j){
        while(i < j){
            char temp = arr[i];
            arr[i++] = arr[j];
            arr[j--] = temp;
        }
    }
}

知识点:

1. 这是一道非常经典的String类型的题目,方法二的处理String的办法很值得看,这道关于String的题目要多看几遍,多写几遍,多思考几遍

2. 这也是一道大翻转类型的题目,要对整体进行翻转,然后再对个体进行翻转,这种思想使用比较广泛,要多多体会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值