目录
1.违禁词处理
你正在为一款聊天系统开发一项功能。为了营造文明的网络环境,需要在帖子中检测并屏蔽某些违禁词汇。系统由管理员提供若干违禁词汇列表,对于帖子中的违禁词汇,需要按照以下规则进行替换:
-
屏蔽规则:
- 检测帖子中是否包含违禁词汇。
- 如果包含违禁词汇,则将违禁词的首字符保留,其余字符用
*
替代。 - 替换过程中,大小写不敏感,但替换后的输出需保留原始字符的大小写格式。
例如:
- 如果违禁词是
Love
,帖子中的Love
替换为L***
,love
替换为l***
。 - 如果违禁词是
ACM
,帖子中的ACM
替换为A**
,acm
替换为a**
。
-
输入要求:
- 输入的第一行是一个正整数 n (n<1000),表示违禁词汇的数量。
- 接下来的 n 行,每行包含一个违禁词汇,由英文字母组成(不含空格,长度不超过 20)。
- 随后的若干行是帖子内容,内容可能包含违禁词汇,需要处理。直到文件结束为止。
- 帖子中的字符总数不超过 10,000。
-
输出要求:
- 输出处理后的帖子内容,保持原始格式,违禁词替换后符合屏蔽规则。
输入格式
- 第一行:一个正整数 n,表示违禁词数量。
- 接下来 n 行:每行一个违禁词。
- 若干行:需要处理的帖子内容,直到文件结束。
输出格式
- 输出经过违禁词处理后的帖子内容。除违禁词外,其余文字和格式与原始帖子完全相同。
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,需要划定面试分数线。具体规则如下:
-
面试分数线划定规则:
- 面试分数线为排名第 m×150% 名选手的笔试分数(向下取整)。
-
进入面试规则:
- 笔试分数不低于面试分数线的所有选手都能进入面试。
-
输出规则:
- 第一行输出面试分数线和实际进入面试的选手人数。
- 从第二行开始,按以下规则输出进入面试的选手信息:
- 按笔试成绩从高到低排序。
- 如果笔试成绩相同,按报名号从小到大排序。
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.火车票分配问题
小华负责火车车厢的座位分配,规则如下:
-
车厢配置:
- 每节车厢有 20 排,每排有 5 个座位,座位编号从 1 到 100。
-
购票规则:
- 每人可以购买 p 张票,1≤p≤5
- 如果能在同一排找到编号最小的连续 p 个座位,则分配这些座位。
- 否则,分配编号最小的 p 个空座位(不要求连续)。
-
输出规则:
- 对每条购票指令,按从小到大的顺序输出分配的座位编号。
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();
}
}
}