一、根据字符出现的频率重新排列字符串
如:happy——>pphap
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(frequence(s));
}
public static String frequence(String s){
//用一个优先队列来标记想要的字符顺序
Map<Character,Integer> map = new HashMap<>();
for(int i=0;i<s.length();i++){
map.put(s.charAt(i),map.getOrDefault(s.charAt(i),0)+1);//当有这个key时,就使用这个key值,没有就使用defaultValue
}
//按照value的大小重新排列
PriorityQueue<Character> maxHeap = new PriorityQueue<>((o1,o2)->map.get(o2) - map.get(o1));
maxHeap.addAll(map.keySet());//将map中所有的字符输入进去
StringBuffer res = new StringBuffer();
while(!maxHeap.isEmpty()){
char key = maxHeap.poll();//按照出现次数输出字符
int val = map.get(key);//得到该字符的出现次数
for(int i=0;i<val;i++){
res.append(key);
}
}
return res.toString();
}
}
二、寻找第K大
——快排
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//Scanner in = new Scanner(System.in);
int[] arr = {1,2,3,2,4,5};
System.out.print(findK(arr,0,arr.length-1,7));
}
public static int partition(int[] arr,int left,int right){
int pivot = arr[left];
while(left < right){
while(left < right && arr[right] <= pivot){
right--;
}
arr[left] = arr[right];
while(left < right && arr[left] >= pivot){
left++;
}
arr[right] = arr[left];
}
arr[left] = pivot;
return left;
}
public static int findK(int[] arr,int left,int right,int k){
if(left<=right){
int pivot = partition(arr,left,right);
if(pivot == k - 1){
return arr[pivot];
}else if(pivot < k-1){
return findK(arr,pivot + 1,right,k);
}else{
return findK(arr,left,pivot - 1,k);
}
}
return -1;
}
}
三、输入一个整数,最多交换两位,输出能得到的最大的数。
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
int n1 = 989865489;
List<Integer> list = numToList(n1);
int len = list.size();
Integer tmpData;
for(int i = len-1;i>=0;i--){ //从后往前找最大的数的位置
Integer cur = list.get(i);
int wz = find(list,i);
Integer max = list.get(wz);
if(max > cur){
tmpData = list.get(wz);
list.set(wz,list.get(i));
list.set(i,tmpData);
break;
}
}
Integer res = getRes(list);
System.out.println(res);
}
//整数转list
public static List<Integer> numToList(int num){
List<Integer> list = new ArrayList<>();
int ws = 10;
int tmp = num;
while(tmp/ws != 0){
list.add(tmp % ws);
tmp /= ws;
}
list.add((tmp % ws) / (ws/10));
return list;
}
//将list转为int整数
public static Integer getRes(List<Integer> list){
int res = 0;
int step = 1;
for(int i = 0;i<list.size();i++){
res += list.get(i) * step;
step *= 10;
}
return res;
}
//从低位开始找出最大数字的位置,冒泡思想
public static int find(List<Integer> list,int i){
Integer max = list.get(0);
int wz = 0;//位置
for(int j = 0;j < i;j++){
if(list.get(j) > max){
max = list.get(j);
wz = j;
}
}
return wz;
}
}