蓝桥 项链(Java)

AILAB专项训练

问题描述

由 n(1≤n≤100)  个珠子组成的一个项链,珠子有红、蓝、白三种颜色,各种颜色的珠子的安排顺序由键盘输入的字符串任意给定。蓝色用小写字母b表示,红色用小写字母r表示,  白色用小写字母w表示.

假定从项链的某处将其剪断,把它摆成一条直线。先从左端向右收集同色珠子,遇到第一个异色珠子时停止.  收集过程中, 白色是一种特殊颜色, 既可以看成红色也可以看成蓝色。然后再从剩余珠子的右端向左重复上述过程。

例如:对下图一所示的项链, 如果从图一中标记的位置0处剪断,  则按顺时针顺序得到wbbbwwrrbwbrrwb(如图二所示)。这时从左端开始收集可以得到wbbbww,   共6个珠子;然后从剩余珠子右端开始收集得到wb,共2个珠子。这种剪法共可收集到6+2=8个珠子。 如果从图一中标记的位置4处剪断,  则按顺时针顺序得到wwrrbwbrrwbwbbb(如图二所示)。这时从左端收集可以得到wwrr,共4个珠子; 然后从剩余珠子右端收集可以得到wbwbbb,共6个珠子。这种剪法共可收集到4+6=10个珠子。

要求: 在项链中选择合适的剪断位置, 使得从左右两端收集到的珠子数目之和最大,输出收集到的珠子数的最大值M。

输入格式

由小写字母b,r,w组成的字符串。此字符串记录了一个首尾相接的项链从某处断开后,按顺时针顺序得到的珠子的直线排列。

输出格式

收集到的珠子数的最大值 M

样例输入

wbbbwwrrbwbrrwb

样例输出

10
import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		int ma = 0;
		for (int i = 0; i < string.length(); i++) {
			int mm = get(string, i);
			ma = mm > ma ? mm : ma;
		}
		System.out.println(ma);
	}

	private static int get(String string, int i) {
		String s1 = string.substring(i) + string.substring(0, i);
		int j1 = 0;
		int j2 = 0;
		char c1 = 'w';
		char c2 = 'w';
		for (int k = 0; k < s1.length(); k++) {
			if (s1.charAt(k) != c1) {
				c1 = s1.charAt(k);
				break;
			}
		}
		for (int k = s1.length() - 1; k > 0; k--) {
			if (s1.charAt(k) != c2) {
				c2 = s1.charAt(k);
				break;
			}
		}
		for (int j = 0; j < s1.length(); j++) {
			if (s1.charAt(j) == c1 || s1.charAt(j) == 'w')
				j1++;
			else {
				break;
			}
		}
		for (int j = s1.length() - 1; j >0; j--) {
			if (s1.charAt(j) == c2 || s1.charAt(j) == 'w')
				j2++;
			else {
				break;
			}

		}
		if (j1 == s1.length())
			return j1;
		return j1 + j2;
	}
}
### 蓝桥杯 1561 Java 解题思路及代码实现 对于蓝桥杯题目编号为1561的相关问题,虽然未提供具体描述,但从已知引用内容可以推测该问题可能涉及数值处理、字符串操作或其他基础算法设计[^1]。以下是基于常见蓝桥杯命题模式的一种假设解答。 #### 假设问题背景 如果题目要求对给定的大整数执行特定运算并返回结果,则可以通过以下方法解决: 1. **数值倍增与取模**:通过调整输入数据的大小关系完成指定计算逻辑。 2. **边界条件判断**:考虑特殊情况下程序的行为是否符合预期。 下面展示一段通用型求解函数及其调用方式作为示范[^1]: ```java import java.util.*; public class BlueBridgeProblem { public static long processNumber(long input) { // Step A: Double the value. input *= 2; // Step B: Divide by a constant factor and adjust based on remainder rules. input /= 10; if (input % 10 >= 5) { input += 10; } return Math.floorDiv(input, 10); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while(scanner.hasNext()) { String line = scanner.nextLine(); try{ long number = Long.parseLong(line.trim()); System.out.println(processNumber(number)); } catch(Exception e){ break; } } scanner.close(); } } ``` 上述代码片段实现了针对大范围正整数的操作流程定义,并提供了交互式的命令行接口用于测试不同样例的表现情况[^1]。 另外值得注意的是,在面对更大规模的数据集或者更加复杂的业务需求时,单纯依靠内置类型可能会遇到溢出风险等问题。此时应当引入更高精度的支持工具比如`BigInteger`库来进行替代开发工作[^2]。 #### 大数支持扩展方案 当面临诸如阶乘这样的指数级增长场景下,常规变量难以胜任存储任务。这时可采用如下策略构建高效可靠的解决方案: ```java import java.math.BigInteger; public class FactorialCalculation { private static final int MAX_LIMIT = 1_000; public static BigInteger calculateFactorial(int n) { BigInteger result = BigInteger.ONE; for(int i=1;i<=n;i++) { result = result.multiply(BigInteger.valueOf(i)); } return result; } public static void main(String []args){ for(int k=0;k<MAX_LIMIT && !Thread.currentThread().isInterrupted();k++){ System.out.printf("%d! = %s%n", k,calculateFactorial(k).toString()); } } } ``` 此版本利用了`BigInteger`类的强大功能解决了传统long/int所能表示的最大界限限制,从而能够轻松应对上千甚至更高的阶乘请求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Abdulaziz02

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

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

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

打赏作者

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

抵扣说明:

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

余额充值