算法学习记录——删去k个数字后的最小值
//问题:一个整数,删除K个数字后的最小值问题
//用栈--这种逻辑存储方式解决问题
//1、这个整数用字符串进行存储,方便操作——其实跟数组一样,只是为了操作上方便一些。
//2、创建一个跟原整数位数一样多的字符数组stack——当作栈来使用,遵循后进先出原则。
/*3、算法关键——栈顶的元素stack[top-1]跟整数(字符串nums[i])当前位 的字符c比较大小,进行是否入栈的操作:
* 对整个整数从左往右找,如果高位nums[i]>nums[i+1],那就删除nums[i]这一位数。
*/
//4、删除k个数后,从左往右,再删除高位为0的数字——用offset记录0的数量。
public class RemoveKDigits {
public static String removeKDigits(String nums, int k) {
//记录删除k个数后,剩余数字的位数。
int newnumlength=nums.length()-k;
//创建一个栈——数组stack,用来记录当前删除后的整数。
char[] stack=new char[nums.length()];
//当作栈顶来用
int top=0;
//核心算法实现
for(int i=0;i<nums.length();i++) {
//存储当前i位的数字
char c=nums.charAt(i);
//判断当前栈顶元素是否大于c,即是否为要删除的数字,如果是,top-1,k-1
while(top>0 && stack[top-1]>c && k>0) {
top=top-1;//出栈
k=k-1;
}
//存储当前位c——入栈
stack[top]=c;
top=top+1;
}
//判断剩余数字中,左侧高位是否有0,并用offset记录0的数量
int offset=0;
while(offset<newnumlength && stack[offset]=='0') {
offset++;
}
//三元运算符返回结果
return offset==newnumlength?"0":new String(stack , offset, newnumlength-offset);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(removeKDigits("1593212",3));
System.out.println(removeKDigits("30200",1));
System.out.println(removeKDigits("10",2));
System.out.println(removeKDigits("541270936",3));
}
}