Codeforces注册系统Java代码问题:用户名后缀数字错误及修正
Codeforces风格注册系统用户名重复后缀递增错误问题
我在实现Codeforces风格的注册系统时遇到问题:当输入多个相同用户名(如A)时,输出的用户名后缀数字始终只有A或A1,无法正确递增。请问错误原因是什么?如何修正以让后缀数字正确显示?
原代码:
import java.util.Objects; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner S = new Scanner(System.in); int n = S.nextInt(); String[] input = new String[n]; S.nextLine(); for (int i = 0; i < n; i++) { boolean N = true; input[i] = S.nextLine();// input a name if (i == 0) { System.out.println("OK"); } else { int counter = 0; for (int j = i - 1; j >= 0; j--) {// test if there is a repeation if (Objects.equals(input[i], input[j]) || Objects.equals(input[i], input[j] + 1) || Objects.equals(input[i], input[j] + 2) || Objects.equals(input[i], input[j] + 3) || Objects.equals(input[i], input[j] + 4) || Objects.equals(input[i], input[j] + 5) || Objects.equals(input[i], input[j] + 6) || Objects.equals(input[i], input[j] + 7) || Objects.equals(input[i], input[j] + 8) || Objects.equals(input[i], input[j] + 9)) { counter++; N = false; } } if (N) { System.out.println("OK"); } else { input[i] = input[i] + counter; System.out.println(input[i]); } } } } }
错误原因
- 计数逻辑完全错误:当前遍历判断逻辑无法正确统计相同用户名的注册次数。比如第三次输入A时,前两次输入的是A和A1,遍历过程中只有A会触发匹配条件,counter只能加到1,所以输出A1而非正确的A2。
- 未区分原始用户名和带后缀的用户名:代码没有记录每个原始用户名的注册次数,反而错误地将带后缀的用户名(如A1)当成独立判断对象,导致无法累计同一个原始用户名的注册次数。
- 匹配条件不符合规则:直接用
input[j] + 数字匹配输入,完全不符合Codeforces的注册逻辑——系统是给重复的原始用户名自动加后缀,而非判断用户输入的名称是否是已有名称加数字。
修正方案
改用HashMap记录每个原始用户名的注册次数,逻辑更清晰高效:
修正后的代码:
import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); scanner.nextLine(); // 键:原始用户名,值:该用户名已注册的次数 HashMap<String, Integer> nameRegisterCount = new HashMap<>(); for (int i = 0; i < n; i++) { String username = scanner.nextLine(); if (!nameRegisterCount.containsKey(username)) { // 首次注册,输出OK并记录次数为1 System.out.println("OK"); nameRegisterCount.put(username, 1); } else { // 重复注册,取出当前次数,输出用户名+次数,然后次数加1 int currentCount = nameRegisterCount.get(username); System.out.println(username + currentCount); nameRegisterCount.put(username, currentCount + 1); } } scanner.close(); } }
修正逻辑说明
- 用
HashMap存储每个原始用户名的注册次数,避免低效的遍历对比; - 首次输入用户名时,Map中无记录,直接输出"OK"并初始化次数为1;
- 后续输入相同用户名时,直接取出当前累计次数,拼接成新用户名输出,再将次数加1,确保下次输出的后缀数字正确递增。
内容的提问来源于stack exchange,提问作者Kit_Key
相关产品推荐
相关产品推荐

