小灰算法--刪去k個數字後的最小值

       題目:
       給出一個整數,從該整數中去掉k個數字,要求剩下的數字形成的新整數儘可能小,應該如何選取去掉的數字。
       其中整數的長度大於或者等於k,給出的整數大小可以超過long類型的數字範圍。

       
       
       解題思路:
       給出一個整數456782575,要求刪去一個數字,無論刪除誰都是9位數,因此優先將高位的數字降低,因此
       把原整數的所有數字從左往右進行比較,如果發現某一位數字大於它右面的數字,那麼就刪除這個數字。如果刪除多個數字,那麼一步一步來求得局部最優解,最終得到全局最優解。
       代碼如下:

public class removeKDigits {
    public static String removeKDigits(String num,int k){
        int newLength = num.length()-k;
        char[] stack = new char[num.length()];
        int top = 0;
        for(int i=0; i<num.length();++i){
            char c = num.charAt(i);
            while(top > 0 &&stack[top - 1] > c && k>0){
                top -=1;
                k -=1;
            }
            stack[top++] = c;
        }
        int offset = 0;
        while(offset < newLength && stack[offset] == '0'){
            offset ++;
        }
        return offset == newLength ? "0" : new String(stack,offset,newLength  - offset);
    }
    public static void  main(String[] args){
        System.out.println(removeKDigits("84586512",3));
        System.out.println(removeKDigits("46581564845",1));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章