3

我有一个关于通过 Java 创建密码的任务:

假设您在一家安全销售公司工作,并且您的经理要求您创建一个包含 0000000000 和 9999999999 之间的所有十位数字的列表,而不在同一个数字中重复一个数字。在JAVA中做这个算法的方法是什么?

这是我到目前为止所做的:

public static long generateNumber()  
{  
    String s1 = "33333";  
    double d = Math.random();  
    d=d*100000.0;  
    int i = (int) d;  
    String s2 = String.valueOf(i);  
    String s3=s1+s2;  
    long m = Long.parseLong(s3);  
    return m;
}
4

3 回答 3

4

如果您正在寻找没有任何重复数字的十位数字,那么您实际上是在寻找生成所有数字的所有排列,即 string "0123456789"

SO上有其他线程可以帮助您解决此问题,例如这些

于 2013-05-04T15:58:51.360 回答
1

使用少量代码的简单方法是:

List<Long> combos = new ArrayList<>();
Set<Character> chars = new HashSet<>();
for (long i = 1000000000; i < 9999999999L; i++) {
    chars.clear();
    for (char c : String.valueOf(i).toCharArray()) {
        chars.add(c);
    }
    if ((chars).size() == 10) {
        combos.add(i);
    }
}

效率不高,但能胜任。

于 2013-05-22T05:59:26.370 回答
0

使用洗牌技术:

    public static void main(String[] args) {
        List<Integer> passwords = Arrays.asList( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 );
        for (int i = 0; i < 10; i ++)
        {
            Collections.shuffle(passwords);
            String p = toFlatString(passwords);
            System.out.println(p);
        }
    }

    private static String toFlatString(List<Integer> list) {
        StringBuilder sb = new StringBuilder();
        for (int i : list)
            sb.append(i);
        return sb.toString();
    }

输出: 2651803497 2936745018 7064918235 1594670823 4035872619 6432971850 6387925401 7103649285 9712380645 9321574806

于 2013-05-04T16:06:33.033 回答