2017年蓝桥杯JavaC组真题 “拉马车”

思路:

        利用队列 + 栈实现

        队列:手中的牌

        栈:打出去的牌

代码实现:


//拉马车
public class Main2 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String A = scanner.next();
		String B = scanner.next();
		// 队列 --- 手中的牌 
		Queue<Character> a = new LinkedList<>();
		Queue<Character> b = new LinkedList<>();
		for (int i = 0; i < A.length(); i++) { //赋值
			a.offer(A.charAt(i));
		}
		for (int i = 0; i < B.length(); i++) {
			b.offer(B.charAt(i));
		}
	
		// 栈 --- 打出去的牌
		Stack<Character> stack = new Stack<>();
		//纪录赢家:flag == 2,b赢了;flag == -1,a赢了
		int flag = 0;  
		
		int index = 1;
		while (index < 100000) {
			// i是奇数就是A出牌
			if (index % 2 != 0 && a.size() != 0) {
				// 移除队列头元素  == 手中牌的最上面那张
				char paia = a.poll();
				// 判读栈是否有这个牌
				if (stack.contains(paia)) {
					// 有这张牌也打出,然后while收走,添加到队列a中
					stack.add(paia);
					// 如果包含牌,那一直循环,移除栈顶元素添加到队列a,相当于把包含的那些牌添加到了a队列中
					while (stack.contains(paia)) {
						a.offer(stack.pop());
					}
					// 赢了继续出牌
					continue;
				} else { // 没有这个牌也要打出来,并添加到栈中
					stack.add(paia);
				}
				if (a.size() == 0) {
					flag = 2;//假设flag =2表示a的牌出完了,就是b赢了
					break;
				}
				//B出牌				
			} else if (index % 2 == 0 && b.size() != 0) {
				char paib = b.poll();
				// 如果存在出的牌,那么就能收牌;
				if (stack.contains(b)) {
					stack.add(paib);
					while (stack.contains(paib)) {
						b.offer(stack.pop());
					}
					// 赢了继续出牌
					continue;
				} else {
					stack.add(paib);
				}
				// 查看是否打完
				if (b.size() == 0) {
					flag = 1;// 假设flag =1表示b的牌出完了,就是a赢了
					break;
				}
			}
			index++;
		}
		//判断赢家
		if (flag == 0) {// 没有赢家
			System.out.println("-1");
		} else if (flag == 1) {// a赢了,输出a的牌
			while (a.size() != 0) {
				System.out.print(a.poll());
			}
		} else if (flag == 2) {// b赢了 ,输出b的牌
			while (b.size() != 0) {
				System.out.print(b.poll());
			}
		}

	}
}

### 蓝桥杯 Java 真题概述 蓝桥杯大赛作为全国性的编程竞赛活动,其 Java 真题涵盖了多种算法和数据结构的知识点。以下是关于蓝桥杯 Java 真题的一些重要信息: #### 题目分类 蓝桥杯的题目通常分为以下几个类别: 1. **基础算法**:涉及简单的循环、条件判断以及基本的数据处理。 2. **字符串操作**:考察字符串匹配、分割、替换等功能。 3. **数与排序**:如引用中的刷题数排序问题[^1],需要对输入的数进行排序并分情况讨论。 4. **动态规划**:解决最优解类问题,例如背包问题或路径优化。 5. **模拟与枚举**:通过暴力方法尝试所有可能的情况,如九数分数问题[^2]。 #### 解析示例 以下是一些具体的例子及其解析: ##### 示例一:刷题数排序问题 对于给定的一学生刷题数量 `nums`,可以通过如下方式解决问题: ```java public static void Java_B_D() { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] nums = new int[n]; int[] count = new int[n]; for (int i = 0; i < nums.length; i++) { nums[i] = scan.nextInt(); count[i] = nums[i]; } Arrays.sort(count); int index; if (n % 2 == 0) { index = n / 2 + 1; } else { index = n / 2; } int middle = count[index]; for (int i = 0; i < n; i++) { if (nums[i] < middle) { System.out.print(middle - nums[i] + 1 + " "); } else { System.out.print("0 "); } } } ``` 此代码实现了对学生刷题数的分析,并根据奇偶性调整中间值的选择逻辑[^1]。 ##### 示例二:兑换糖果问题 另一个经典问题是计算可以兑换的最大糖果数目: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int ans = n; while (n >= 3) { int t = n / 3; n = t + n % 3; ans += t; } System.out.println(ans); } } ``` 这段代码展示了如何利用整除运算来实现最大化的糖果兑换策略[^2]。 ##### 示例三:龄范围求解 针对特定条件下寻找符合条件的两个龄值的问题: ```java public class Solution { public static void main(String[] args) { for (int i = 1; i <= 100; i++) { for (int j = i + 1; j <= 100; j++) { if ((i + j) * (j - i + 1) / 2 == 236) { System.out.println(i + " " + j); } } } } } ``` 该程序通过双重循环遍历所有可能性,最终找出满足条件的结果[^3]。 ### 总结 蓝桥杯 Java 的历真题覆盖了广泛的计算机科学基础知识和技术应用能力测试。参赛者需熟练掌握各种常见算法及其实现技巧,同时具备较强的逻辑思维能力和实际动手编码经验。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芒果果。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值