华为OD刷题C卷 - 每日刷题 25(找座位,密码输入检测)

73 篇文章 0 订阅
37 篇文章 1 订阅

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";
        }
    }
}
  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值