욕심쟁이 알고리즘 - 삭제 질문

문제 (1) 설명 : 정수 N 비트 포지티브 주어 모든 K를 삭제 <= N 자리수 도면의 나머지는 양의 정수를 형성하는 원래 순서에 따라 정렬 된 후. 소정의 양의 정수 n은 양의 정수 K, 새로운 천공 방식의 최소 수치의 나머지 자리를 확인하기위한 알고리즘이다;

소정의 양의 정수 A의 최소 수 후 계산 번호 삭제 ;: K (2) 알고리즘으로 설계된 수득

(3) 알고리즘의 아이디어 : 요지 남기고 삭제 삭제하도록, 소정 수 A를, 그것의 모든 번호, 그리 디 알고리즘, 로컬 최적의 방법을 이용하여, 최소 비트 수를 이탈; 전제 : 제거 과정에서, 최소 위치에 숫자가 아니라 원칙이 충분히 삭제할 수 있도록 보장하는 것이 불안 할 때 삭제의 수

(4) 코어 코드 :

 

공용  클래스 DeleteData { 

    / ** 
     * 주어진 양의 정수 
     * / 
    개인  정적 정수 NUM; 

    / ** 
     * 스토어 데이터 어레이 
     * / 
    개인  정적 정수 [] 데이터; 

    / ** 
     * 전체 삭제 
     * / 
    개인  정적 정수 합계] 

    / ** 
     * 삭제 표시기 
     * / 
    개인  정적 부울 [] deleteFlag; 

    / ** 
     * 초기화 데이터 
     * / 
    개인  정적  공극 initData () { 
        정수 인덱스 = 0 ; 
        스캐너 INPUT = 새로운 새스캐너합니다 (System.in) 

        에서 System.out.println는 ( "주어진 양의 정수를 입력하세요 :" ); 
        문자열 numstr = input.nextLine (); 
        NUM = Integer.valueOf (numstr) 

        에서 System.out.println ( " 삭제 된 양의 정수의 숫자를 입력하세요 : " );  = input.nextInt은 (); 
        데이터 = 새로운 새로운 정수를 [numStr.length ()] 
        deleteFlag =이 새로운 새로운 부울 [numStr.length ()]; 

        // 분할 납입 요소 데이터 어레이 [178,543 저장 -> 데이터 = {3, 4, 5, 8, 7, 1} } 
        그동안 (! NUM = 0 ) { 
            데이터 [색인] 10 %를 NUM = ;
            NUM = NUM / 10 ; 
            deleteFlag [색인] = 거짓 ; 
            인덱스 ++ ; 
        } 
        // 데이터数组逆置
         ( INT I 0 = data.length입니다 J = - 1; I <J; I ++, j-- ) { 
            정수 온도 = 데이터 [I]; 
            데이터 [I] = 데이터 [J] 
            데이터 [J] = 온도; 
        } 
    } 

    / ** 
     *删除
     * / 
    개인  정적  무효 deleteData () {
         INT를 찾기 = 0;       // 0에서 초기 인덱스를 찾는 시작 
        그동안 (총! = 0 ) {
             지능 분 = 10 ;
             INT 인덱스 = -1 ;
             // data.length입니다 - I I 이하에 도시 된 것보다 후방 도면의 나머지 이상을 표시하거나 찾을 동일 자릿수 충분한 천공되도록, 전체 
            를 들어 ( INT I = 찾기; I <data.length입니다 && data.length입니다 - I> = 총; I ++ ) {
                 IF (데이터 [I] < 분) {  = 데이터 [I] , 
                    인덱스 = I는; 
                } 
            } 
            IF (인덱스> = 0 ) { 
                deleteFlag [인덱스]= True로 ;    // 디지털에 머물 휴가 
            } 
            찾기 = 인덱스 + 1;            //이 현재 위치가 이미 최소이기 때문에 인덱스에서 직접 다음 시작을 찾고 옆에, 당신이 찾아 반복 할 필요가 없습니다 
            total-- ; 
        } 
    } 

    / ** 
     * 출력 
     * / 
    개인  정적  공극 인쇄 () { 
        에서 System.out.println는 ( "최소 값을 삭제 이후" )
         에 대한 ( INT ; I는 <deleteFlag.length I ++ I = 0 ) {
             IF (deleteFlag [I ]) { 
                System.out.print (데이터 [I]); 
            } 
        } 
    }

    공공  정적  무효 메인 (문자열 []에 args) {
         // 초기화 데이터 
        initData (); 

        // 삭제 
        deleteData (); 

        // 출력 
        인쇄 () 
    } 

}

 

(5) 입력 출력 :

: 주어진 양의 정수를 입력하세요
 178543이 
삭제 된 양의 정수의 수를 입력하십시오 :
 2 
의 최소 값을 삭제 한 후입니다 :
 13

(6) 요약 : 알고리즘의 아이디어는 떠나 최적의 솔루션이 제거 마지막 마무리 한 후, 지역 최적의 솔루션을 찾고, 각각의 사이클 번호를 삭제, 욕심 좋은 반응 문제의 번호를 삭제;

 

추천

출처www.cnblogs.com/blogtech/p/12294316.html