2013 华为编程大赛java组初赛试题

题目描述 某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。 假设路灯只有如下3种状态(分别用数字0, 1, 2标识,一盏路灯只对应其中一种状态): 0 标识路灯熄灭; 1 标识路灯开启; 2 标识路灯故障; 请根据输入的字符串,找出该街道上连续的处于相同状态的路灯的最大个数。若两种状态的路灯数量相同,则返回最先出现的路灯状态。
输入 街道上连续的路灯组成的状态字符串。字符串中只包含数字,每个路灯的状态为0,1,2中的一种状态。如“1101”代表4盏路灯,第3盏路灯为熄灭状态,其它3盏为开启状态。
输出 连续为相同状态的路灯的最大数量; 上述路灯的状态; 要求:先输出数量,再输出状态,两个整数间采用一个空格间隔。如输出: 53 2
样例输入 112200111
样例输出 3 1
package com.huawei.test;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Scanner;
import java.util.Stack;
import java.util.Map.Entry;


public class FirstApp {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入状态字符串:");
Scanner input=new Scanner(System.in);
String str=input.nextLine();
getnumsandstate(str);
}


public static void getnumsandstate(String input) {
Stack<String> statestack = new Stack<String>();
Stack<Integer> timesstack = new Stack<Integer>();
LinkedHashMap<String, Integer> hm = new LinkedHashMap<String, Integer>();
ArrayList<Integer> timelist = new ArrayList<Integer>();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
String temp = String.valueOf(c);
if (!statestack.isEmpty()) {
if (statestack.peek().equals(temp)) {
if (timesstack.isEmpty()) {
timesstack.push(1);
} else {
int k = timesstack.pop();
k++;
timesstack.push(k);
}
} else {
statestack.push(temp);
timesstack.push(1);
}
} else {
statestack.push(temp);
timesstack.push(1);
}
}
// 把状态栈和次数栈的数值放到hashmap中
while (!statestack.isEmpty()) {
String key = statestack.pop();
int value = timesstack.pop();
if (hm.containsKey(key)) {
int beforevalue = hm.get(key);
if (value > beforevalue) {
hm.remove(key);
hm.put(key, value);
}
} else {
hm.put(key, value);
}
}
// 比较hm里面的值取value最大的值,如果有次数相同的则取后面的状态
Iterator<Entry<String, Integer>> iterator = hm.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, Integer> entry = iterator.next();
int value = entry.getValue();
timelist.add(value);
}
int maxvalue = timelist.get(0);
for (int i = 1; i < timelist.size(); i++) {
int value = timelist.get(i);
if (value > maxvalue) {
maxvalue = value;
}
}
// 求出最大值最大的状态定义最先的状态和次数
Iterator<Entry<String, Integer>> iterator1 = hm.entrySet().iterator();
String state1=null;
int times1=0;
while (iterator1.hasNext()) {
Entry<String, Integer> entry = iterator1.next();
String key = entry.getKey();
int value = entry.getValue();
if (value == maxvalue) {
state1=key;
times1=value;
}
}
System.out.println(times1+" "+state1);
}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值