題目:
給出一個整數,從該整數中去掉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));
}
}