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

为何我的字符串处理代码在Hyperskill平台不通过?求纠错优化

问题排查与优化方案

嘿,我看了你的代码,发现几个关键问题导致Hyperskill平台不认可,咱们一步步捋清楚:

1. 补充字符的逻辑太局限

当你需要填充quantity - upper - lower - digits个额外字符时,只从数字里选,这会导致密码里数字占比过高,而且完全没考虑从大写或小写字母里随机补充——平台的测试用例大概率会检查密码的多样性,这肯定过不了。

2. 去重逻辑有明显漏洞

你的while循环里的exit设置逻辑不对:只要碰到一对不重复的字符,就把exit设为true直接退出循环,这会导致如果后面还有重复的字符根本没机会处理。比如密码是AABB,处理到第二个A和第一个B时,你会直接认为没问题退出,但后面的B还是和前一个B重复。另外,把重复字符移到末尾的操作也不靠谱,很可能刚移完,末尾的字符又和倒数第二个重复了。

优化后的代码

我给你改了一版,解决了这些问题,逻辑更可靠:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int requiredUpper = scan.nextInt();
        int requiredLower = scan.nextInt();
        int requiredDigits = scan.nextInt();
        int totalLength = scan.nextInt();
        scan.close();

        String upperChars = "QWERTYUIOPASDFGHJKLZXCVBNM";
        String lowerChars = "qwertyuiopasdfghjklzxcvbnm";
        String digitChars = "0123456789";
        Random random = new Random();

        List<Character> passwordChars = new ArrayList<>();

        // 先添加满足最低要求的各类字符
        for (int i = 0; i < requiredUpper; i++) {
            passwordChars.add(upperChars.charAt(random.nextInt(upperChars.length())));
        }
        for (int i = 0; i < requiredLower; i++) {
            passwordChars.add(lowerChars.charAt(random.nextInt(lowerChars.length())));
        }
        for (int i = 0; i < requiredDigits; i++) {
            passwordChars.add(digitChars.charAt(random.nextInt(digitChars.length())));
        }

        // 补充剩余字符,随机从三类字符中挑选
        int remaining = totalLength - passwordChars.size();
        for (int i = 0; i < remaining; i++) {
            int type = random.nextInt(3);
            switch (type) {
                case 0:
                    passwordChars.add(upperChars.charAt(random.nextInt(upperChars.length())));
                    break;
                case 1:
                    passwordChars.add(lowerChars.charAt(random.nextInt(lowerChars.length())));
                    break;
                case 2:
                    passwordChars.add(digitChars.charAt(random.nextInt(digitChars.length())));
                    break;
            }
        }

        // 循环打乱直到没有连续重复字符
        boolean hasDuplicates;
        do {
            Collections.shuffle(passwordChars);
            hasDuplicates = false;
            for (int i = 1; i < passwordChars.size(); i++) {
                if (passwordChars.get(i).equals(passwordChars.get(i-1))) {
                    hasDuplicates = true;
                    break;
                }
            }
        } while (hasDuplicates);

        // 拼接成最终密码
        StringBuilder passwordBuilder = new StringBuilder();
        for (char c : passwordChars) {
            passwordBuilder.append(c);
        }
        System.out.println(passwordBuilder);
    }
}

优化点解释

  • 补充字符随机化:剩余的字符不再只加数字,而是随机从大写、小写、数字三类里选,保证密码的多样性,符合平台的测试标准。
  • 可靠的去重逻辑:用do-while循环,每次打乱后检查整个密码是否有连续重复,如果有就重新打乱,直到得到完全没有连续重复的版本——这种方式比你之前的移动字符逻辑靠谱多了,不会遗漏任何重复情况。
  • 细节优化:关闭了Scanner避免资源泄漏,变量名改成更清晰的命名(比如requiredUpper代替upper),可读性更好。

另外,Hyperskill的测试用例应该都是合法输入(比如不会要求某类字符数量多到无法避免连续重复的情况),所以咱们不用处理那种极端的非法输入场景。

内容的提问来源于stack exchange,提问作者Andetleenew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:29