1451. 重新排列句子中的单词

Posted zjpaang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1451. 重新排列句子中的单词相关的知识,希望对你有一定的参考价值。

https://leetcode-cn.com/problems/rearrange-words-in-a-sentence/

非常简单的题目,首先先将字符串按照空格进行分割,然后将第一个字符串的首字母转成小写。

然后对字符串数组进行排序,按照字符串的长度进行排序,因为题目要求要保持原有的顺序,所以我采用了最简单的冒泡排序进行编写。

排序完后,对第一个字符串的首字母进行大写化,然后用StringBuilder一个一个添加回去即可。

执行结果:

执行用时 :1017 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :40.8 MB, 在所有 Java 提交中击败了100.00%的用户
class Solution {
    public String arrangeWords(String text) {
        String[] str = text.trim().split(" ");
        str[0] = str[0].toLowerCase();
        for(int i = 0; i < str.length; i++){
            for(int j = 0; j < str.length - i - 1; j++){
                if(str[j].length() > str[j+1].length()){
                    String temp = str[j];
                    str[j] = str[j+1];
                    str[j+1] = temp;
                }
            }
        }
        str[0] = str[0].substring(0,1).toUpperCase() + str[0].substring(1);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str.length; i++){
            sb.append(str[i]);
            if(i != str.length -1){
                sb.append(" ");
            }
        }
        return sb.toString();
    }
}

当然,看了评论区的题解后,我才知道原来Java自带的Arrays.sort()排序方法本身就是稳定的,所以就优化成了下面这个样子。

class Solution {
    public String arrangeWords(String text) {
        String[] str = text.trim().split(" ");
        str[0] = str[0].toLowerCase();
        Arrays.sort(str, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        });
        str[0] = str[0].substring(0,1).toUpperCase() + str[0].substring(1);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str.length; i++){
            sb.append(str[i]);
            if(i != str.length -1){
                sb.append(" ");
            }
        }
        return sb.toString();
    }
}
执行用时:28 ms
内存消耗:40.6 MB
 
看得出来Java自带的排序比手写的快了多少~~虽然我知道冒泡排序并不是稳定排序的最佳选择。
 
后续:我自己手写了一次归并排序,同时评论区也有人指出Arrays.sort(T[],Comparator<? super T> c) 内部采用的归并排序,因此是稳定的。Arrays.sort(int[] a) 内部采用的快速排序,因此是不稳定的。并且根据个人的代码来看,的确就是这个样子。
class Solution {
    public String arrangeWords(String text) {
        String[] str = text.trim().split(" ");
        str[0] = str[0].toLowerCase();
        str = mergeSort(str);
        str[0] = str[0].substring(0,1).toUpperCase() + str[0].substring(1);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < str.length; i++){
            sb.append(str[i]);
            if(i != str.length -1){
                sb.append(" ");
            }
        }
        return sb.toString();
    }
    
    private String[] mergeSort(String[] str){
        if(str.length <= 1){
            return str;
        }
        String[] str1 = mergeSort(Arrays.copyOfRange(str,0,str.length/2));
        String[] str2= mergeSort(Arrays.copyOfRange(str,str.length/2,str.length));
        return merge(str1,str2);
    }
    
    private String[] merge(String[] str1, String[] str2){
        String[] str = new String[str1.length + str2.length];
        int i = 0;
        int j = 0;
        int index = 0;
        while(i < str1.length && j < str2.length){
            if(str1[i].length() > str2[j].length()){
                str[index++] = str2[j++];
            }else{
                str[index++] = str1[i++];
            }
        }
        while(i < str1.length){
            str[index++] = str1[i++];
        }
        while(j < str2.length){
            str[index++] = str2[j++];
        }
        return str;
    }
}

 

以上是关于1451. 重新排列句子中的单词的主要内容,如果未能解决你的问题,请参考以下文章

Lc5413_重新排列句子中的单词

Lc5413_重新排列句子中的单词

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何通过C#中的特定片段从句子中提取整个单词?

回文数或回文数是指一个像14641这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。

如何让 Python 中的 for 循环更高效