지식 점 14: 배열 에 1 - 100 의 중복 되 지 않 는 난수 문제 가 저장 되 어 있 습 니 다.

문제 설명: 길이 가 100 인 배열 에 1 - 100 개의 무 작위 수 를 무 작위 로 삽입 하고 무 작위 수 는 중복 되 지 않 으 며 다른 유형의 데이터 구 조 를 사용 할 수 없습니다.배열 로 만 완성 할 수 있 습 니 다.해법 1:
/**
 *     :
 *     1-100     z
 * .
 *            
 *     ,   
 *      ,      
 *   :    
 *     :**
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int count =0;
        do {
            int randomNumber = new Random().nextInt(100)+1;
            if (!isAlive(randomNumber,arrays)) {
                arrays[count++] = randomNumber;
            }
        } while (!(count == arrays.length));

    }
/*
*      
*/
    static boolean isAlive(int number,int[] arrays){
        boolean isAlive = false;
        for (int i = 0; i < arrays.length; i++) {
            if (number == arrays[i]) {
                isAlive = true;
            }
        }
        return isAlive;
    }

이 해법 은 보편적 인 사람들의 사고방식 에 부합 되 어야 한다. 다만 이렇게 하면 하나의 문 제 를 초래 할 수 있다. 수조 안의 난수 가 많 을 수록 중 복 될 확률 이 커진다. 즉, 더 많은 난수 를 생 성 해 야 하기 때문에 효율 이 매우 낮 기 때문에 추천 하지 않 는 다.하지만 다른 최적화 가 생각 나 지 않 는 다 면 먼저 참조 할 수 있다.다음은 최적화 해법 이다.
해법 2:
/**
 *     :
         100   ,    1-100   
            ,              
                   ,             (-1)
              ,            ,    ,     
 *     :***
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int datalength=100;
        int[] data = new int[datalength];
        for (int i = 0; i < data.length; i++) {
            data[i] = i+1;
        }
        int count = 0;
        do{
            int  rand =new Random().nextInt(datalength--);
            int tmp=data[rand];
            data[rand] = data[datalength];
            data[datalength] = tmp;
            arrays[count++] = data[datalength];
        }while(count != arrays.length);
    }
}

이 알고리즘 은 어느 정도 효율 문 제 를 최적화 시 켰 으 나 메모리 도 증가 시 켰 다.이 메모리 가 치 명 적 인 건 아니 지만그러나 전반적 으로 최적화 할 수 있 는 부분 이 있다.해법 3:
/**
 *     :
            1-100    ,      ,                      ,         (-1)
          ,      
 *     :****
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int datalength =arrays.length;
        for (int i = 0; i < arrays.length; i++) {
            arrays[i]= i+1;
        }
        do{
            int  rand =new Random().nextInt(datalength--);
            int tmp=arrays[rand];
            arrays[rand] = arrays[datalength];
            arrays[datalength] = tmp;
        }while(datalength>0);
    }
}

이 알고리즘 은 현재 생각 할 수 있 는 가장 좋 은 방법 입 니 다. 메모 리 를 추가 하지 않 을 뿐만 아니 라 무 작위 값 이 중복 되 는 문제 도 피 할 수 있 습 니 다.이것 과 해법 2 의 문 제 는 메모리 하 나 를 추가 하 는 지 여부 에 만 국한 되 며, 본질 적 으로 일치 하 므 로 참고 할 수 있다.

좋은 웹페이지 즐겨찾기