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. 重新排列句子中的单词的主要内容,如果未能解决你的问题,请参考以下文章
使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化
回文数或回文数是指一个像14641这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。