Java排队吃饭问题

某公司员工到餐厅吃饭,吃饭要排队。因为公司的员工都是有素质的,让女同事排在队伍的前面。只要男同事发现自己的后面是一位女同事的话,该男同事将会与后面的女同事调换位置,调换位置需要1秒钟的时间。在同一时间可能会有多位男同事与后面女同事调换位置。我们需要求队伍调整完毕需要的总时间。M代表男同事,F代表女同事,排队顺序使用字符串,字符串的开头代表队伍的最前面。现在举个例子,假设初始的队伍是”MFMF“,那么第一秒中将有两位男同事与后面的女同事调换位置,此时的队伍变成”FMFM“,然后再接下来的一秒钟有一位男同事与后面女同事调换位置,现在队伍就变成”FFMM“,这样所有的女同事都排在男同事的前面,总时间用了2秒钟。(本题来源于互联网)

1.求出所有字串"MF"在队伍的位置

        public static List<Integer> getIndex(String str) {
 		List<Integer> list = new ArrayList<Integer>();
 		for (int index = 0; index < str.length();) {
 			int j = str.indexOf("MF", index);
			 if(j==-1)
 				break;
			list.add(j);
 			index = j + 2;
		}
		 return list;
	}
2.一次调换位置

	public static String replace(String str, List<Integer> list) {
  		char[] c = str.toCharArray();
 		for (int i = 0; i < list.size(); i++) {
			 c[list.get(i)] = 'F';
			 c[list.get(i) + 1] = 'M';
		}
		return new String(c);
	}

3.计算"MF"在队伍中出现的次数

	public static Integer getCount(String str) {
		Integer i = 0;
		for (int index = 0; index < str.length();) {
			
			int j=str.indexOf("MF", index);
			if(j==-1)
				break;
			i++;
			index = j + 2;
		}
		return i;
	}

4.递归求出队伍好调整需要的总时间

	public static Integer getResult(String str) {
		if (getCount(str) == 0) {
			return 0;
		}
		return getResult(replace(str, getIndex(str)))+1;
	}




用程序简单模拟一个单队列多窗口的排队模式: 设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。 1.输入格式 第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数,接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式分别是:  顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数;  叫号,用Calling表示。 最后一行是一个#符号,表示输入结束。 注意:  题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。  保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。 2.输出格式 对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:  顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数  顾客想进银行,若因等候区满而被拒绝,则输出<id> rejected. 其中<id>是该顾客的编号  叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数  叫号,等候区无人,则输出 No one! 这个是大学初学数据结构所做的一次作业任务,里面还有非常多可以优化的地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值