• 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;
        }
    }
  • 相关阅读:
    这一段
    转安装vs2003 提示重启
    转解决VSS中Access to file "rights.dat" denied的错误
    C# 页面基类
    C#密码加密
    转 如何改变*.sln文件的路径
    后台为按钮定义js事件
    sql2005 数据库还原
    vss 代码管理器
    转 如何有效的使用C#读取文件 及如何解决中文乱码问题
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/12909973.html
Copyright © 2020-2023  润新知