课程考核 三道模拟题

目录


1.违禁词处理

2.分数线划分

3.火车票分配问题


1.违禁词处理

你正在为一款聊天系统开发一项功能。为了营造文明的网络环境,需要在帖子中检测并屏蔽某些违禁词汇。系统由管理员提供若干违禁词汇列表,对于帖子中的违禁词汇,需要按照以下规则进行替换:

  1. 屏蔽规则:

    • 检测帖子中是否包含违禁词汇。
    • 如果包含违禁词汇,则将违禁词的首字符保留,其余字符用 * 替代。
    • 替换过程中,大小写不敏感,但替换后的输出需保留原始字符的大小写格式。

    例如:

    • 如果违禁词是 Love,帖子中的 Love 替换为 L***love 替换为 l***
    • 如果违禁词是 ACM,帖子中的 ACM 替换为 A**acm 替换为 a**
  2. 输入要求:

    • 输入的第一行是一个正整数 n (n<1000),表示违禁词汇的数量。
    • 接下来的 n 行,每行包含一个违禁词汇,由英文字母组成(不含空格,长度不超过 20)。
    • 随后的若干行是帖子内容,内容可能包含违禁词汇,需要处理。直到文件结束为止。
    • 帖子中的字符总数不超过 10,000。
  3. 输出要求:

    • 输出处理后的帖子内容,保持原始格式,违禁词替换后符合屏蔽规则。

输入格式

  1. 第一行:一个正整数 n,表示违禁词数量。
  2. 接下来 n 行:每行一个违禁词。
  3. 若干行:需要处理的帖子内容,直到文件结束。

输出格式

  • 输出经过违禁词处理后的帖子内容。除违禁词外,其余文字和格式与原始帖子完全相同。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取违禁词数量
        int n = Integer.parseInt(scanner.nextLine());
        // 存储违禁词列表
        List<String> forbiddenWords = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            forbiddenWords.add(scanner.nextLine());
        }
        
        // 将违禁词转换为小写以方便查找
        Set<String> forbiddenSet = new HashSet<>();
        for (String word : forbiddenWords) {
            forbiddenSet.add(word.toLowerCase());
        }

        // 处理输入文本到文件结束
        StringBuilder result = new StringBuilder();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            String[] words = line.split(" "); // 按空格分割单词
            for (int i = 0; i < words.length; i++) {
                String word = words[i];
                String lowerWord = word.toLowerCase(); // 转换为小写检查
                if (forbiddenSet.contains(lowerWord)) {
                    // 替换违禁词,首字符保留,其余字符用 *
                    result.append(word.charAt(0));
                    for (int j = 1; j < word.length(); j++) {
                        result.append('*');
                    }
                } else {
                    // 非违禁词原样输出
                    result.append(word);
                }
                if (i < words.length - 1) {
                    result.append(" "); // 单词之间加空格
                }
            }
            result.append("\n"); // 每行结束换行
        }

        // 输出处理后的文本
        System.out.print(result.toString());
    }
}

2.分数线划分

世博会志愿者的选拔正在进行,A市对报名选手进行了笔试。根据计划录取人数 mmm,需要划定面试分数线。具体规则如下:

  1. 面试分数线划定规则:

    • 面试分数线为排名第 m×150% 名选手的笔试分数(向下取整)。
  2. 进入面试规则:

    • 笔试分数不低于面试分数线的所有选手都能进入面试。
  3. 输出规则:

    • 第一行输出面试分数线和实际进入面试的选手人数。
    • 从第二行开始,按以下规则输出进入面试的选手信息:
      • 按笔试成绩从高到低排序。
      • 如果笔试成绩相同,按报名号从小到大排序。
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入报名人数 n 和计划录取人数 m
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        // 保存选手信息
        List<int[]> participants = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int id = scanner.nextInt();
            int score = scanner.nextInt();
            participants.add(new int[]{id, score});
        }

        // 按笔试成绩从高到低排序,若成绩相同按报名号从小到大排序
        Collections.sort(participants, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                if (b[1] != a[1]) {
                    return b[1] - a[1]; // 按成绩从高到低
                } else {
                    return a[0] - b[0]; // 按报名号从小到大
                }
            }
        });

        // 计算面试分数线
        int cutoffIndex = (int) Math.floor(m * 1.5) - 1; // m * 150% 向下取整
        int interviewScore = participants.get(cutoffIndex)[1];

        // 筛选进入面试的选手
        List<int[]> selected = new ArrayList<>();
        for (int[] p : participants) {
            if (p[1] >= interviewScore) {
                selected.add(p);
            }
        }

        // 输出面试分数线和实际进入面试的人数
        System.out.println(interviewScore + " " + selected.size());

        // 输出进入面试选手的报名号和笔试成绩
        for (int[] p : selected) {
            System.out.println(p[0] + " " + p[1]);
        }
    }
}

3.火车票分配问题

小华负责火车车厢的座位分配,规则如下:

  1. 车厢配置:

    • 每节车厢有 20 排,每排有 5 个座位,座位编号从 1 到 100。
  2. 购票规则:

    • 每人可以购买 p 张票,1≤p≤5
    • 如果能在同一排找到编号最小的连续 p 个座位,则分配这些座位。
    • 否则,分配编号最小的 p 个空座位(不要求连续)。
  3. 输出规则:

    • 对每条购票指令,按从小到大的顺序输出分配的座位编号。 
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入购票指令数量
        int n = scanner.nextInt();
        int[] requests = new int[n];
        for (int i = 0; i < n; i++) {
            requests[i] = scanner.nextInt();
        }

        // 座位状态数组,false 表示空座,true 表示已占用
        boolean[] seats = new boolean[100];

        // 处理每条购票指令
        for (int request : requests) {
            List<Integer> assigned = new ArrayList<>();
            boolean assignedFlag = false;

            // 尝试分配连续座位
            for (int i = 0; i < 100; i += 5) {
                int count = 0;
                for (int j = i; j < i + 5; j++) {
                    if (!seats[j]) {
                        count++;
                    } else {
                        count = 0;
                    }
                    if (count == request) {
                        // 找到连续座位,分配
                        for (int k = j - request + 1; k <= j; k++) {
                            seats[k] = true;
                            assigned.add(k + 1);
                        }
                        assignedFlag = true;
                        break;
                    }
                }
                if (assignedFlag) break;
            }

            // 如果无法分配连续座位,分配分散座位
            if (!assignedFlag) {
                for (int i = 0; i < 100 && assigned.size() < request; i++) {
                    if (!seats[i]) {
                        seats[i] = true;
                        assigned.add(i + 1);
                    }
                }
            }

            // 输出分配的座位编号
            for (int i = 0; i < assigned.size(); i++) {
                if (i > 0) System.out.print(" ");
                System.out.print(assigned.get(i));
            }
            System.out.println();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值