2023 05 01 重复局面
- 题目
- 题解1
- 题解2
- 区别:
- 数据存储方式:
- 时间复杂度:
- 空间复杂度:
- 总结:
题目
题解1
import java.util.*;public class Main {public static void main(String[] args) {Scanner input = new Scanner(System.in);int n = input.nextInt(); // 输入n,表示字符串数量HashMap<String, Integer> strs = new HashMap<>(); // 创建一个HashMap,用于存储字符串及其出现次数for (int i = 0; i < n; i++) {String str = ""; // 初始化空字符串用于存储当前输入的字符串// 依次输入8个字符串,并拼接成一个完整的字符串for (int j = 0; j < 8; j++) {String s = input.next();str += s;}if (i == 0) {// 如果是第一个字符串,直接输出1,并将该字符串放入HashMap中System.out.println(1);strs.put(str, 1);} else {if (strs.containsKey(str)) {// 如果HashMap中已存在该字符串,更新其出现次数strs.put(str, strs.get(str) + 1);} else {// 如果HashMap中不存在该字符串,将其放入HashMap,并设置出现次数为1strs.put(str, 1);}// 输出该字符串出现的次数System.out.println(strs.get(str));}}}
}
题解2
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 输入n,表示字符串数量String res[] = new String[n]; // 用于存储输入的字符串int j = -1, count = 1;// 获取输入for (int i = 0; i < 8 * n; i++) {if (i % 8 == 0) {j++; // 每8个字符换行存储到res数组中}res[j] += sc.next(); // 读取下一个字符串,并拼接到对应位置}System.out.println(1); // 第一个字符串输出1,因为第一个肯定是唯一的j = 0;// 判断输出for (int i = 1; i < n; i++) {for (j = 0; j < i; j++) {if (res[i].equals(res[j])) {count++; // 如果与之前的字符串相同,计数加1}}System.out.println(count); // 输出该字符串出现的次数count = 1; // 重置计数器为1,准备下一个字符串的判断}}
}
区别:
数据存储方式:
题解1中使用了HashMap,将每个字符串作为键,出现次数作为值,实现了O(1)时间复杂度的查找和更新。
题解2中使用了一个String数组,每个位置存储一个字符串,通过比较字符串的方式来统计出现次数。这样的方法比较低效,因为每次查找都需要遍历整个数组。
时间复杂度:
题解1中使用HashMap,查找和更新的时间复杂度都是O(1),因此整体时间复杂度是O(n)。
题解2中使用了两个嵌套的循环来比较字符串,时间复杂度为O(n^2),效率较低。
空间复杂度:
题解1中HashMap的空间复杂度取决于不同的字符串数量,最坏情况下是O(n)。
题解2中使用了一个String数组,空间复杂度也取决于不同的字符串数量,最坏情况下也是O(n)。
总结:
题解1使用HashMap的方式更加高效,可以快速统计每个字符串出现的次数,而且代码相对简洁。
题解2虽然实现了相同的功能,但由于字符串比较的方式导致时间复杂度高,适用于数据量较小的情况。