面试题:打乱一个1~100的数组(睡眠算法)

哎!今天遇到一个面试题,腾讯电话一面。当时紧张得脑壳都抽掉了,给了三个方案都不行,并且自我感受都很差。啊,太紧张了,脑壳都不会转了。面试

题目

题目的大意就是:打乱一个1~100的数组(每一个数打乱的几率要相同)数组

1、等待取票

面试完静下来想了想,能不能有其余好的解法,而后第一种想法居然是相似“睡眠排序”。安全

个人思路:去动物园排队,100我的,去盒子里取号,根据号码顺序入场。bash

如何设置这个盒子:获取🎫的规则,随机生成。dom

public class Main {
    public static void main(String[] args) {
        TicketThread[] tt = new TicketThread[101];  
        for (int i = 1; i < 101; i++) {  
            tt[i] = new TicketThread(i);  
        } 
        for (int i = 1; i < 101; i++) {  
            tt[i].start();  
        }  
    }
}
class TicketThread extends Thread{  
    private int val = 0;  
    int max = 100;
    int min = 0;
    public TicketThread(int val){  
        this.val = val;  
    }  
    public void run(){  
        try {  
            sleep((int) (Math.random()*(max-min)+min));
        } catch (InterruptedException e) {       
            e.printStackTrace();  
        }  
        System.out.println(val);  
    }  
} 
复制代码

2、交换门票

第二种方法我回会宿舍的路上想到的,就是“交换门票”。this

思路:按顺序发了门票,而后闭着眼睛两两交换,每一个人必须主动交换一次。(包括与本身)spa

如何交换:生成1—100的随机数,和站在那的人交换。(交换的是两个位置的人手中的票,不是交换对应的号码)code

public class Main {
    public static void main(String[] args) {
        int[] tt = new int[100];
        int max = 100;
        int min = 0;
        for(int i = 0;i < tt.length;){
            tt[i] = ++i;
        }
        for(int i = 0;i < tt.length;++i){
            int ran = (int) (Math.random()*(max-min)+min);
            int temp = tt[i];
            tt[i] = tt[ran];
            tt[ran] = temp;
        }
        for(int x : tt){
            System.out.println(x); 
        }
    }
}
复制代码

总结一下:面试真的超级紧张,面试者的思考不会太发散,老是在本身的安全范围内搜索答案,哎,多多参加点面试,锻炼锻炼。上次视频面试有点头晕,还好撑住了那几秒。视频

相关文章
相关标签/搜索