输入 abc3c5,输出cccccabcabcabc
输入ab3c3 ,输出cccababab
import java.util.ArrayList;
public class Main{
public static void main(String[]args){
String str="a5A5d4b4a2c3aa3";
System.out.println(jieya(str));
}
public static String jieya(String str){
if(str==null)return null;
if(str.trim()=="")return "";
char[]ch=str.toCharArray();
String sb="";
ArrayList<String>slist=new ArrayList<>();//用来存储字串
ArrayList<Integer>ilist=new ArrayList<>();//用来存储slist中对应位置的字串出现的次数
String temp="";
for(int i=0;i<ch.length;i++){//将输入的字符串拆分成两个List,slist放字串,ilist放对应位置的字串出现的次数
if(ch[i]>48&&ch[i]<=57){
slist.add(temp);
ilist.add(ch[i]-48);
temp="";
}else
temp+=ch[i];
}
sort(ilist,slist,0,ilist.size()-1);//通过对ilist排序来对slist排序
int count=0;
for(int i=0;i<ilist.size()-1;i++){//对slist中出现次数相同的字串根据ASCII码排序
if(ilist.get(i)==ilist.get(i+1))
count++;
else{
if(count>0){
sorts(slist,i-count,i);
}
count=0;
}
}
for(int i=0;i<ilist.size();i++){//将输入按要求排好序后解压
while(ilist.get(i)>0){
sb+=slist.get(i);
ilist.set(i,ilist.get(i)-1 );
}
}
return sb;
}
private static void sort(ArrayList<Integer>ilist,ArrayList<String>slist,int be,int en){
for(int i=be;i<=en;i++){
int min=i;
for(int j=i+1;;j<ilist.size();j++){
if(ilist.get(min)>ilist.get(j))
min=j;
}
if(i!=min){
int temp0=ilist.get(i);
String temp1=slist.get(i);
ilist.set(i,ilist.get(min));
slist.set(i,slist.get(min));
ilist.set(min,temp0);
slist.set(min,temp1);
}
}
}
private static void sorts(ArrayList<String>slist,int be,int en){
char[][]arr=new char[en-be+1][];
int temp=-1;
for(int i=be;i<=en;i++){
arr[++temp]=slist.get(i).toCharArray();
}
int[]in=new int[en-be+1];
for(int i=be;i<=en;i++){
for(int j=0;j<arr[i-be].length;j++){
in[i-be]+=arr[i-be][j];
}
}
for(int i=be;i<=en;i++){
int min=i;
for(int j=i+1;j<=en;j++){
if(in[j-be]<in[min-be])
min=j;
}
if(min!=i){
String temp1=slist.get(i);
slist.set(i,slist.get(min));
slist.set(min,temp1);
}
}
}
}