You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]);
                }
            }
        }
    }
}

错误原因

  1. 计数逻辑完全错误:当前遍历判断逻辑无法正确统计相同用户名的注册次数。比如第三次输入A时,前两次输入的是A和A1,遍历过程中只有A会触发匹配条件,counter只能加到1,所以输出A1而非正确的A2。
  2. 未区分原始用户名和带后缀的用户名:代码没有记录每个原始用户名的注册次数,反而错误地将带后缀的用户名(如A1)当成独立判断对象,导致无法累计同一个原始用户名的注册次数。
  3. 匹配条件不符合规则:直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:45:12