题目:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
“tree”
输出:
“eert”
解释:
'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入:
“cccaaa”
输出:
“cccaaa”
解释:
'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入:
“Aabb”
输出:
“bbAa”
解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意’A’和’a’被认为是两种不同的字符。
题解:这道题有两种解法,1.遍历字符串,将字符及其频率的键值对存储到map中,然后对map根据value值进行排序;2.遍历字符串,将字符及其频率的键值对存储到map中,使用桶排序进行求解。
1.Hashmap方法:
package com.ljq.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
/**
* @author 作者 Your-Name:
* @version 创建时间:2019年8月28日 上午9:48:10
* 类说明
*/
public class CharFreSort {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String string = scanner.nextLine();
String ret = frequencySort(string);
System.out.println(ret);
}
scanner.close();
}
public static String frequencySort(String s) {
StringBuffer ret = new StringBuffer();
if(s.length()<=0) {
return ret.toString();
}
Map<Character, Integer> map = new HashMap<Character, Integer>();
for(int i=0;i<s.length();i++) {
map.put(s.charAt(i),map.getOrDefault(s.charAt(i), 0)+1);
}
/*
* map根据value值排序
*/
List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Entry<Character, Integer>>() {
@Override
public int compare(Entry<Character, Integer> arg0, Entry<Character, Integer> arg1) {
// TODO 自动生成的方法存根
return arg1.getValue()-arg0.getValue();
}
});
for(Entry<Character, Integer> item:list) {
int count = item.getValue();
char key = item.getKey();
for(int i=0;i<count;i++) {
ret.append(key);
}
}
return ret.toString();
}
}
2.桶排序方法
package com.ljq.sort;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
/**
* @author 作者 Your-Name:
* @version 创建时间:2019年8月28日 上午10:17:45
* 类说明
*/
public class BucktSortChar {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String string = scanner.nextLine();
String ret = frequencySort(string);
System.out.println(ret);
}
scanner.close();
}
public static String frequencySort(String s) {
StringBuffer ret = new StringBuffer();
if(s.length()<=0) {
return ret.toString();
}
Map<Character,Integer> map = new HashMap<Character, Integer>();
for(int i=0;i<s.length();i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0)+1);
}
List<Character>[] busket = new ArrayList[s.length()+1];
/*
* 桶的下标代表频次,桶的元素为出现下标次数的字符
*/
Set<Entry<Character, Integer>> set = map.entrySet();
for(Entry<Character, Integer> item:set) {
int value = item.getValue();
char key = item.getKey();
if(busket[value]==null) {
busket[value] = new ArrayList<Character>();
}
busket[value].add(key);
}
for(int i=busket.length-1;i>=0;i--) {
if(busket[i]==null) {
continue;
}
for(int j=0;j<busket[i].size();j++) {
char key = busket[i].get(j);
for(int k=0;k<i;k++) {
ret.append(key);
}
}
}
return ret.toString();
}
}