题目:
给你一个原始字符串,根据该字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
提示:
1、原始字符串中只会出现字母和数字。
2、注意区分大小写。
例子:
如果输入为:22233aaabcccdd
则输出应为: 23abcd23acd2ac
解答(Java实现):
package com.yym.test;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class Test {
public static void main(String[] args) {
Test test = new Test();
MyMap myMap = test.new MyMap();
String str0="22233aaabcccdd";//可改写成从键盘读取
initData(str0,myMap);//初始化数据
show(myMap);//展示数据
}
/**
* 初始化myMap
* 将str字符串分割成char数组,然后按要求存进myMap的map中,
* 并且记录重复字符的最大重复次数,存进myMap的maxValue中
* @param str
* @param myMap
*/
public static void initData(String str,MyMap myMap){
char[] buf=str.toCharArray();
for(Character c:buf){
if(myMap.map.containsKey(c)){//若map中已经有该key
int valueNow = myMap.map.get(c);
myMap.map.put(c, valueNow+1);
if(myMap.maxValue<valueNow+1) {//记录最大重复次数
myMap.maxValue = valueNow+1;
}
}else{
myMap.map.put(c, 1);
myMap.maxValue = 1;
}
}
/**
* 按照要求输出相应字符
* @param myMap
*/
public static void show(MyMap myMap) {
for (int i = 0;i<=myMap.maxValue;i++) {
Iterator<Map.Entry<Character, Integer>> iterator = myMap.map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Character, Integer> entry = iterator.next();
char c = entry.getKey();
if(entry.getValue()>0) {//若字符对应的值大于0
System.out.print(c);//输出字符
myMap.map.put(c, myMap.map.get(c)-1);
}
}
}
}
/**
* 内部类,保存map和重复数最大值
* @author YYM
*
*/
class MyMap{
int maxValue;
Map<Character, Integer> map;
public MyMap() {
maxValue = 0;
map=new TreeMap<Character, Integer>();
}
}
}
思路:
先将string转化为treeMap,根据treeMap的特性,得到的是ASCII增序排序好的map,然后按要求循环输出,每输出一次,将map的对应value值减一,当map中所有key对应的value均不大于0时,输出结束。