问题 A: 查词典
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
现在有一本将汪星人语言翻译成喵星人语言的词典,请你写一段查该词典的程序。
输入格式
第一行为一个整数n(0<n<=1000),后边是n行,每行均为两个用空格分隔的字符串,前边的字符串代表喵星人的单词,后边的字符串代表汪星人的单词,而且在词典中不会有某个汪星人的单词出现两次或两次以上。从第n+2行开始有若干行(行数大于1且小于等于1000),每行均为一个字符串,代表汪星人语言的文档,该文档最后一行一定是dog。
测试用例保证1、输入中出现所有单词都只包含小写字母,而且长度不会超过10;2、输入中只会在最后一行出现一次dog。
输出格式
在输出中,你需要把输入文档翻译成喵星人语言,每行输出一个喵星人单词。如果某个汪星人单词不在词典中,就把这个单词翻译成“dog”。
样例输入
3
mmm www
m w
mm ww
ww
wwww
w
dog
样例输出
mm
dog
m
答:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner inputScanner = new Scanner(System.in);
// 读取词典
int numOfLines = inputScanner.nextInt();
inputScanner.nextLine(); // 读取换行符
Map<String, String> WToMDictionary = new HashMap<>();
for (int i = 0; i < numOfLines; i++) {
String[] line = inputScanner.nextLine().split(" ");
WToMDictionary.put(line[1], line[0]);
}
// 翻译文档
String line;
while (!(line = inputScanner.nextLine()).equals("dog")) {
String[] words = line.split(" ");
for (String word : words) {
String translation = WToMDictionary.getOrDefault(word, "dog");
System.out.println(translation);
}
}
inputScanner.close();
}
}
Keys:
1. Maps:
Maps是Java中的一种数据结构,用于存储键值对。它提供了快速的查找和访问能力。常见的Map实现类有HashMap、TreeMap和LinkedHashMap。使用Map可以通过键来访问对应的值,而且键是唯一的,不会重复。
一般用法:
- 存储和获取数据:使用`put(key, value)`方法将键值对添加到Map中,然后使用`get(key)`方法通过键来获取对应的值。
- 遍历Map:可以使用`entrySet()`方法获取Map中的键值对集合,然后使用`for-each`循环遍历每个键值对。
- 判断键是否存在:使用`containsKey(key)`方法可以检查Map中是否包含指定的键。
- 删除键值对:使用`remove(key)`方法可以从Map中删除指定的键值对。
2. Scanner的split 和 equals:
- Scanner是Java中用于读取输入的类,它可以从各种来源(如键盘、文件等)读取数据。使用Scanner可以方便地读取不同类型的输入,如整数、浮点数和字符串。
- split是字符串类的一个方法,用于将字符串拆分成子字符串。可以指定一个分隔符,将原始字符串按照分隔符进行拆分,并返回一个字符串数组。
// 可以把以空格分隔的一行内容依次读入
String[] line = inputScanner.nextLine().split(" ");
// 可以把形如08:00的时间直接拆成小时,分钟
String[] line = inputScanner.nextLine().split(":");
- equals是Java中用于比较两个对象是否相等的方法。它可以用于比较两个字符串、两个对象或其他可比较的类型。equals方法通常与条件语句(如if语句)一起使用,用于判断两个对象是否相等。
一般用法:
- 使用split拆分字符串:使用`split(delimiter)`方法,将一个字符串按照指定的分隔符进行拆分,并返回一个字符串数组。可以使用数组的每个元素进行进一步的处理。
- 使用equals比较对象:使用equals方法比较两个对象是否相等,可以通过`object1.equals(object2)`的方式进行比较。各种数据类型均可采用本格式进行相同与否的比较。注意,在使用equals方法比较字符串时,应该使用`str1.equals(str2)`,而不是使用`str1 == str2`进行比较。
3. for循环遍历集合:
- 遍历集合:通过结合使用`for-each`循环和集合类(如List、Set等),可以方便地遍历集合中的元素。
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
for (String name : names) {
System.out.println(name);
}
问题 B: 集合运算
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
第一行为一个整数n,表示集合A中的元素个数。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
第一行按从小到大的顺序输出A、B交集中的所有元素。
第二行按从小到大的顺序输出A、B并集中的所有元素。
第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入
5
1 2 3 4 5
5
2 4 6 8 10
样例输出
2 4
1 2 3 4 5 6 8 10
1 3 5
答:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 读取集合A
int numberInA = input.nextInt();
Set<Integer> setA = new HashSet<>();
for (int i = 0; i < numberInA; i++) {
int element = input.nextInt();
setA.add(element);
}
// 读取集合B
int numberInB = input.nextInt();
Set<Integer> setB = new HashSet<>();
for (int i = 0; i < numberInB; i++) {
int element = input.nextInt();
setB.add(element);
}
// 使用StringBuilder优化输出
StringBuilder output = new StringBuilder();
// 计算交集
Set<Integer> intersection = new TreeSet<>(setA);
intersection.retainAll(setB);
for (int element : intersection) {
output.append(element).append(" ");
}
System.out.println(output.toString());
output.setLength(0); // 重置StringBuilder对象
// 计算并集
Set<Integer> union = new TreeSet<>(setA);
union.addAll(setB);
for (int element : union) {
output.append(element).append(" ");
}
System.out.println(output.toString());
output.s