题目:
给出一个整数,从该整数中去掉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));
}
}