1. 程式人生 > 其它 >力扣451(java)-根據字元出現頻率排序(中等)

力扣451(java)-根據字元出現頻率排序(中等)

題目:

給定一個字串 s ,根據字元出現的 頻率 對其進行 降序排序 。一個字元出現的 頻率 是它出現在字串中的次數。

返回 已排序的字串 。如果有多個答案,返回其中任何一個。

 示例 1:

輸入: s = "tree"
輸出: "eert"
解釋: 'e'出現兩次,'r'和't'都只出現一次。
因此'e'必須出現在'r'和't'之前。此外,"eetr"也是一個有效的答案。
示例 2:

輸入: s = "cccaaa"
輸出: "cccaaa"
解釋: 'c'和'a'都出現三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正確的,因為相同的字母必須放在一起。
示例 3:

輸入: s = "Aabb"
輸出: "bbAa"
解釋: 此外,"bbaA"也是一個有效的答案,但"Aabb"是不正確的。
注意'A'和'a'被認為是兩種不同的字元。
 

提示:

1 <= s.length <= 5 * 105
s 由大小寫英文字母和數字組成

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/sort-characters-by-frequency
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題思路:

1.首先判斷特殊情況,字串為空的情況,就返回s;

2.根據s構建HashMap,鍵key為s中的每個字母,值value為對應字母出現的次數;

3.填充map,遍歷s,如果當前key存在,就返回對應的value+1,不存在就返回預設值 +1;

4.構造一個桶的集合buckets,桶的長度為s.length()+1,目的是為了讓出現i次的字元放在對應的第i個桶裡;

5.遍歷map中的所有key(字元),獲取當前字元的次數value,如果某個桶還未放入過字元,則將其初始化為一個字元陣列,然後將key存放進對應的buckets[value];

6.最後從桶的最後往前遍歷,如果桶裡有字元,則遍歷桶裡的每個字元,字元出現幾次就向結果數組裡新增幾次該字元,最後將陣列轉換成字串進行返回。

程式碼:

 1 class Solution {
 2     public String frequencySort(String s) {
 3         if(s.length() == 0 || s == null){
 4             return s;
5 } 6 Map<Character, Integer> map = new HashMap<Character, Integer>(); 7 for(int i = 0; i < s.length(); i++){ 8 char c = s.charAt(i); 9 map.put(c, map.getOrDefault(c,0) + 1); 10 } 11 List<Character>[] buckets = new List[s.length() + 1]; 12 for(char key : map.keySet()){ 13 //將當前字元的次數賦值給value 14 int value = map.get(key); 15 //如果當前某個桶裡還沒有字元,則對其進行初始化 16 if(buckets[value] == null){ 17 buckets[value] = new ArrayList<Character>(); 18 } 19 //將字元放進桶裡 20 buckets[value].add(key); 21 } 22 StringBuffer res = new StringBuffer(); 23 for(int i = buckets.length-1; i > 0 ; i--){ 24 if(buckets[i] != null){ 25 for(char c : buckets[i]){ 26 for(int j = i; j > 0; j--){ 27 res.append(c); 28 } 29 } 30 } 31 } 32 return res.toString(); 33 } 34 }

 小知識:

1.Java不能建立泛型型別的陣列

List<Character>[] buckets = new List[s.length() + 1];
不能寫成:
List<Character>[] buckets = new List<Character>[s.length() + 1];

2.map.keySet(): 獲取map中所有的key值

3.Stringbuffer是動態字串陣列,append()是往動態字串陣列新增,如"x”+"y"相當那個+號,跟String不同的是stringbuffer是放一起的String1+String2,

例如:
StringBuffer s = new StringBuffer("Hello" ) ; 
s.append("world");
則s的內容是Helloworld。