0到9生成4个8位数的字符串

  分享一个面试题,哎,用自己的方法写了我好久才写出来,查了一下资料记个笔记。。。

public static void main(String[] args) {

        //题目:0到9这几个数字生成4个不相同的8位数的字符串,例如12345678,12345687,12345786,123456768  注意,每一个字符串中的数字也是不能重复的
        //错误分析:我原来的思路是首先我们要想办法获取一个八位数的字符串,只要这个能成功弄出来,我们循环四次然后丢到HashSet中就搞定了
        //所以我就想着弄一个List存放0到9,然后循环8次,每次都获取一个随机数m,然后将随机数m%list.size()得到索引下标,根据下标获取这个数之后然后
        //在List中将这个数remove掉,那么下次从集合中获取一个数字的时候就不会重复了,只是这种方式贼鸡儿麻烦。。。我也是醉了

        //正确分析:经过我查了一些资料,其中我们的目标是得到8个不重复的数字而已,那么直接用一个HashSet当容器,接收随机数10*Math.random(),
        //当set中的数量到达8个就满足条件了呀
        Set result = new HashSet<>();
        while (result.size() < 4) {
            result.add(getNoRepectStr());
        }
        System.out.println("生成的四个字符串为:" + result);


    }

    //获取一个8位不重复的字符串,注意我们获取随机数有两种方式,一种是Math.random()生成一个「0,1)之间的数,那么生成0到9,只需要乘以10就行了
    // 另一种是Random random = new Random();random.nextInt(10),也是生成0到9
    //我个人推荐的话直接使用第一种吧,不需要new对象,写起来比较方便
    public static String getNoRepectStr() {
        StringBuilder sb = new StringBuilder();
        Set set = new HashSet<>();
        while (set.size() < 8) {
            //0到9随机数
            int ran = (int) (10 * Math.random());
            set.add(ran);
        }
        //将set中的数字拼接成字符串然后返回
        //这里有个很有意思的东西,set中的元素是从小到达排序好了的,例如往set中依次放入1,3,2,你打印的话会是1,2,3,
        // 不是说好的set中的元素是无序的么?有兴趣可以查查资料为啥叻?
        for (Integer num : set) {
            sb.append(num);
        }
        return sb.toString();
    }

 

你可能感兴趣的:(0到9生成4个8位数的字符串)