词频排序
public String frequencySort(String s){
char[] chars = s.toCharArray();
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
for(char c : chars){
if(map.containsKey(c)){
map.put(c, map.get(c)+1);
}else{
map.put(c, 1);
}
}
// 大顶堆 按照字符对应的频率排序
PriorityQueue<Character> pq = new PriorityQueue<>(
chars.length,
(c1, c2) -> {return map.get(c2)-map.get(c1);});
// 入大顶堆
for(char c : map.keySet()){
pq.offer(c);
}
StringBuilder strb = new StringBuilder();
while(!pq.isEmpty()){
char c = pq.poll();
int cnt = map.get(c);
while(cnt-- > 0){
strb.append(c);
}
}
return strb.toString();
}
两个数组求交集【包含重复】
// Map记录数和频次
int[] intersect(int[] nums1, int[] nums2){
HashMap<Integer, Integer> map = new HashMap<>();
for(int i : nums1){
if(!map.containsKey(i)){
map.put(i, 1);
}else{
map.put(i, map.get(i)+1);
}
}
ArrayList<Integer> list = new ArrayList<>();
for(int j : nums2){
if(map.containsKey(j)){
list.add(j);
map.put(j, map.get(j)-1);
if(map.get(j)==0){
map.remove(j);
}
}
}
int[] res = new int[list.size()];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i);
}
return res;
}
两个有序数组求交集
int[] intersect_2(int[] nums1, int[] nums2){
int i=0, j=0;
ArrayList<Integer> list = new ArrayList<>();
while(i<nums1.length && j<nums2.length){
if(nums1[i]==nums2[j]){
list.add(nums1[i]);
i++;
j++;
}else if(nums1[i]<nums2[j]){
i++;
}else{
j++;
}
}
int[] res = new int[list.size()];
for (int k = 0; k < res.length; k++) {
res[k] = list.get(k);
}
return res;
}
K-Sum问题
好理解的方法:排序 + 对撞指针