题目A:路灯统计
题目描述
某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。
假设路灯只有如下3种状态(分别用数字0, 1, 2标识,一盏路灯只对应其中一种状态):
0 标识路灯熄灭;
1 标识路灯开启;
2 标识路灯故障;
请根据输入的字符串,找出该街道上连续的处于相同状态的路灯的最大个数。若两种状态的路灯数量相同,则返回最先出现的路灯状态。
输入
街道上连续的路灯组成的状态字符串。字符串中只包含数字,每个路灯的状态为0,1,2中的一种状态。如“1101”代表4盏路灯,第3盏路灯为熄灭状态,其它3盏为开启状态。
输出
连续为相同状态的路灯的最大数量;
上述路灯的状态;
要求:先输出数量,再输出状态,两个整数间采用一个空格间隔。如输出:
53 2
样例输入
112200111
样例输出
3 1
public static String statisticOccurMaxCountDigit(String input){
char[] c=input.toCharArray();
Stack<Character> stack=new Stack<Character>();
for(int i=c.length-1;i>=0;i--){
stack.push(c[i]);
}
LinkedHashMap<Character,Integer> lhm=new LinkedHashMap<Character,Integer>();
int count=0;
while(!stack.isEmpty()){
char ch=stack.pop();
count++;
if(!stack.isEmpty()){
if(stack.peek()!=ch){
saveStateAndCount(lhm, count, ch);//记录状态和次数
count=0;
}
}else{
saveStateAndCount(lhm, count, ch);
}
}
List<Map.Entry<Character,Integer>> list=new ArrayList<Map.Entry<Character,Integer>>(lhm.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Character,Integer>>(){
@Override
public int compare(Entry<Character, Integer> o1,
Entry<Character, Integer> o2) {
return o2.getValue()-o1.getValue();//降序
}});
return String.valueOf(list.get(0).getValue())+","+String.valueOf(list.get(0).getKey());
}
private static void saveStateAndCount(LinkedHashMap<Character, Integer> lhm, int count, char ch) {
if(lhm.containsKey(ch)){
if(lhm.get(ch)<count){
lhm.remove(ch);
lhm.put(ch, count);
}
}else{
lhm.put(ch, count);
}
}