为什么我的代码不正确(处理字符串)?

Andetleenew:

我目前正在上一门有关超技能的在线课程。有一个任务:

如果密码包含至少A个大写字母,至少B个小写字母,至少C个数字并且恰好包含N个符号,则很难破解。另外,密码不能包含两个或多个相同的字符,并且接连出现。对于给定的数字A,B,C,N,您应该输出符合这些要求的密码。

这是我的代码:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int upper = scan.nextInt();
        int lower = scan.nextInt();
        int digits = scan.nextInt();
        int quantity = scan.nextInt();
        String symbolsUpper = "QWERTYUIOPASDFGHJKLZXCVBNM";
        String symbolsLower = "qwertyuiopasdfghjklzxcvbnm";
        String symbolsDigits = "1234567890";
        boolean exit = false;
        Random random = new Random();
        ArrayList<Character> password = new ArrayList<>();
        if (upper > 0) {
            for (int i = 0; i < upper; i++) {
                password.add(symbolsUpper.charAt(random.nextInt(symbolsUpper.length())));
            }
        }
        if (lower > 0) {
            for (int k = 0; k < lower; k++) {
                password.add(symbolsLower.charAt(random.nextInt(symbolsLower.length())));
            }
        }
        if (digits > 0) {
            for (int z = 0; z < digits; z++) {
                password.add(symbolsDigits.charAt(random.nextInt(symbolsDigits.length())));
            }
        }
        if (quantity - digits - upper - lower > 0) {
            for (int m = 0; m < (quantity - digits - upper - lower); m++) {
                password.add(symbolsDigits.charAt(random.nextInt(symbolsDigits.length())));
            }
        }
        Collections.shuffle(password);
        while (!exit) {
            if (password.size() > 1) {
                for (int i = 1; i < password.size(); i++) {
                    if (password.get(i).equals(password.get(i - 1))) {
                        char buffer = password.get(i);
                        password.remove(i);
                        password.add(buffer);
                        i--;
                    } else {
                        exit = true;
                    }
                }
            } else {
                exit = true;
            }
        }
        StringBuilder buildPassword = new StringBuilder();
        for (Character character : password) {
            buildPassword.append(character);
        }
        System.out.println(buildPassword);
    }
}

当我在IntelliJ IDEA中运行代码时,该程序可以正常运行,但是hyperskill平台不接受此代码作为正确的代码。主题是“处理字符串”。

有人可以告诉我,我做错了什么吗?有没有更好的方法来编写此代码?

梅塞尔:

我不知道您是否正在尝试获得最佳性能,但这是一个有趣的解决方案:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int uppers = scan.nextInt();
    int lowers = scan.nextInt();
    int digits = scan.nextInt();
    int quantity = scan.nextInt();
    int freeChoices = quantity - uppers - lowers - digits;
    if (freeChoices < 0) {
        System.exit(1);
    }
    ThreadLocalRandom r = ThreadLocalRandom.current();
    StringBuilder password = new StringBuilder();
    boolean isPasswordReady = false;
    int lastUpper = -1, lastLower = -1, lastDigit = -1;
    PasswordPart[] options = PasswordPart.values();
    while (!isPasswordReady) {
        int partChoice = r.nextInt(0, options.length);
        switch (options[partChoice]) {
            case DIGIT:
                if (digits > 0 || freeChoices > 0) {
                    CharIndexHolder result = options[partChoice].get(lastDigit, -1, r);
                    password.append(result.c);
                    lastDigit = result.i;
                    if (digits == 0) {
                        freeChoices--;
                    } else {
                        digits--;
                    }
                }
                break;
            case LOWER:
                if (lowers > 0 || freeChoices > 0) {
                    CharIndexHolder result = options[partChoice].get(lastLower, lastUpper, r);
                    password.append(result.c);
                    lastLower = result.i;
                    if (lowers == 0) {
                        freeChoices--;
                    } else {
                        lowers--;
                    }
                }
                break;
            case UPPER:
                if (uppers > 0 || freeChoices > 0) {
                    CharIndexHolder result = options[partChoice].get(lastUpper, lastLower, r);
                    password.append(result.c);
                    lastUpper = result.i;
                    if (uppers == 0) {
                        freeChoices--;
                    } else {
                        uppers--;
                    }
                }
                break;

        }

        isPasswordReady = uppers == 0 && lowers == 0 && digits == 0 && freeChoices == 0;
    }

    System.out.println(password.toString());
}

enum PasswordPart {
    UPPER("QWERTYUIOPASDFGHJKLZXCVBNM"), LOWER("qwertyuiopasdfghjklzxcvbnm"), DIGIT("1234567890");
    private String pool;

    PasswordPart(String pool) {
        this.pool = pool;
    }

    public CharIndexHolder get(int lastIndex, int additionalIndex, ThreadLocalRandom random) {
        int i = random.nextInt(0, pool.length());
        while (i == lastIndex || i == additionalIndex) {
            i = random.nextInt(0, pool.length());
        }

        return new CharIndexHolder(pool.charAt(i), i);
    }
}

private static class CharIndexHolder {
    char c;
    int i;


    CharIndexHolder(char c, int i) {
        this.c = c;
        this.i = i;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“输入字符串的格式不正确”-为什么?

为什么我得到错误“输入字符串的格式不正确”

为什么我的Shell字符串中的输出不正确?

无法理解为什么实例化我的对象时输入字符串的格式不正确?

为什么在尝试解码我的 base32 字符串时会收到“不正确的填充”错误?

用户代码未处理 FormatException(字符串格式不正确)

我如何处理输入字符串的格式不正确

为什么我的代码条件不正确?

为什么[[]]中的字符串匹配条件不正确?

从字符串解析浮点值时不正确,双重效果,为什么?

为什么'new Date()'不正确地解析字符串日期?

为什么return语句输出不正确的字符串/整数格式?

为什么代码分析不正确?

字符串长度不正确

字符串格式不正确

为什么我的数学不正确

为什么我的图像不正确?

在C#中,为什么此转换会导致“输入字符串的格式不正确”。错误?

代码输出正确的信息,但格式不正确,如何分割字符串?

为什么我的代码每次都需要回显“正确”时回显“不正确”?

我编译了这个看似不正确的代码,但我不明白为什么

为什么我的数学代码总是说我的答案不正确?

为什么我的代码运行不正确?如果陈述,这有什么问题?

未处理FormatException:输入字符串的格式不正确

从Excel处理CSV文件到MySQL中,产生“字符串值不正确”错误

不正确的字符串值的编码字符 - 在我的SQL插入蟒

为什么我的unicode字符串无法正确处理(打印/复制)?

为什么mysqli bind函数不能正确处理我的字符串?

字符串赋值给定。上面的代码中输入字符串的格式不正确