1、(找座位):
这段代码是解决“找座位”的问题。它提供了一个Java类Main,其中包含main方法和maxSeat方法,用于计算在遵守疫情防控要求的情况下,体育场内一排座位最多还能坐下多少名观众。
main方法首先读取输入的座位分布字符串,然后调用maxSeat方法并打印能坐下的最大人数。
maxSeat方法通过遍历座位字符串来计算可以坐下的观众数量。如果遇到空座位(用’0’表示),则检查其左右是否至少有一侧是空的,如果是,则该座位可以坐下一个人,并且标记为已坐(用’1’表示)。如果两侧都不空,则不能坐下人。如果遇到已坐的座位(用’1’表示),则跳过该座位并检查下一个座位。
最后,返回可以坐下的观众总数。
2、(密码输入检测):
这段代码是解决“密码输入检测”的问题。它提供了一个Java类Main,其中包含main方法和check方法,用于处理用户输入的密码字符串,并判断密码是否满足安全要求。
main方法首先读取输入的密码字符串,然后调用check方法并打印最终的密码字符串和是否满足安全要求的结果。
check方法首先使用StringBuilder来构建最终的密码字符串,忽略退格操作(即输入中的’<'字符)。然后,使用一系列计数器来统计大写字母、小写字母、数字和其他字符的数量。最后,根据密码安全要求,判断密码是否合法,并返回密码字符串和布尔值表示的合法性。
package OD344;
import java.util.Scanner;
/**
* @description 找座位
* @level 6
* @type 逻辑分析
* @score 100
* @url https://hydro.ac/d/HWOD2023/p/OD344
*/
/**
* 题目描述
* 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。
* <p>
* 现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位的情况下,最多还能坐下多少名观众。
* <p>
* 输入描述
* 一个数组,用来标识某一排座位中,每个座位是否已经坐人。0表示该座位没有坐人,1表示该座位已经坐人。
* <p>
* 1 ≤ 数组长度 ≤ 20000
* 输出描述
* 整数,在不移动现有观众座位的情况下,最多还能坐下多少名观众
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String seat = sc.nextLine();
System.out.println(maxSeat(seat));
}
}
/**
* 返回最大还能坐的人数
* @create 2024/3/16 17:33
* @param s
* @return int
*/
public static int maxSeat(String s) {
int count = 0;
char[] seat = s.toCharArray();
for (int i = 0; i < seat.length; i++) {
//如果是0,则判断该位置左边和右边是否有人,都没人则可以坐
if (seat[i] == '0') {
//判断左边是否空闲
boolean isLeftFree = i == 0 || seat[i - 1] == '0';
//判断右边是否空闲
boolean isRightFree = i == seat.length - 1 || seat[i + 1] == '0';
//如果该位置左右都空闲,则count+1,
if (isLeftFree && isRightFree) {
count++;
seat[i] = '1';
//因为该位置坐人了,则右手紧挨的位置一定不能坐人了,相当于连跳两个位置,减少循环
i++;
}
}else {
//如果该位置是1,则右手位置一定不能坐人,则连跳一个位置,减少循环
i++;
}
}
return count;
}
}
package OD345;
import java.util.Scanner;
/**
* @description 密码输入检测
* @level 6
* @type 数据结构、栈
*/
/**
* 题目描述
* 给定用户密码输入流 input,输入流中字符 '<' 表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。
* <p>
* 密码安全要求如下:
* <p>
* 密码长度 ≥ 8;
* 密码至少需要包含 1 个大写字母;
* 密码至少需要包含 1 个小写字母;
* 密码至少需要包含 1 个数字;
* 密码至少需要包含 1 个字母和数字以外的非空白特殊字符;
* 注意空串退格后仍然为空串,且用户输入的字符串不包含 '<' 字符和空白字符。
* <p>
* 输入描述
* 用一行字符串表示输入的用户数据,输入的字符串中 '<' 字符标识退格,用户输入的字符串不包含空白字符,例如:
* <p>
* ABC<c89%000<
* <p>
* 输出描述
* 输出经过程序处理后,输出的实际密码字符串,并输出改密码字符串是否满足密码安全要求。两者间由 ',' 分隔, 例如:
* <p>
* ABc89%00,true
*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
System.out.println(check(s));
}
// 判断输入的密码是否合法
public static String check(String s) {
int n = s.length();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
if (s.charAt(i) != '<'){
sb.append(s.charAt(i));
}else {
//遇到"<"时,删除最后一个字符
if (sb.isEmpty()){
continue;
}else {
//删除最后一位
sb.deleteCharAt(sb.length() - 1);
}
}
}
String newPassword = sb.toString();
//需要检测的长度、大小写、数字、符号
int len = newPassword.length();
int upper = 0;
int lower = 0;
int num = 0;
int other = 0;
//遍历
for (int i = 0; i < len; i++) {
char a = newPassword.charAt(i);
if (a >= 'A' && a <= 'Z'){
upper++;
}else if (a >= 'a' && a <= 'z'){
lower++;
}else if (a >= '0' && a <= '9'){
num++;
}else {
other++;
}
}
if (upper >= 1 && lower >= 1 && num >= 1 && other >= 1 && len >= 8) {
return newPassword + ",true";
}else {
return newPassword + ",false";
}
}
}