删除k个数字后的最小值

    科技2022-07-20  119

    求一个数字删除k个数字元素后的最小值

    代码如下(含注释):

    /** * 删除整数的k个数字后的最小值 * 贪心算法 * @author Administrator * */ public class Remove_K_Digits { public static String removeKDigits(String num,int k) { for(int i=0;i<k;i++)//贪心的次数 { boolean hasCut=false; //从左向右遍历,找到比自己右侧数字大的数字并删除自己 for(int j=0;j<num.length()-1;j++)//j只能定位到倒数第二个 { if(num.charAt(j)>num.charAt(j+1)) { num=num.substring(0,j)+num.substring(j+1,num.length());//该方法前闭后开 hasCut=true; break; } } //如果没有找到要删除的数字,则删除最后一个 if(!hasCut) { num=num.substring(0,num.length()-1); } } //清除数字左侧的数字0,最后一位保留(无论是不是0) int start=0; for(int j=0;j<num.length()-1;j++) { if(num.charAt(j)!='0') { break; } start++; } num=num.substring(start,num.length()); //如果整数的所有数字都被删除了,返回0 if(num.length()==0) { return "0"; } return num; } /** * 用栈优化的算法时间-空间都是O(n) * @param num * @param k * @return */ public static String removeKDigits_1(String num,int k) { //新整数的最终长度=原整数长度-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; } //找到栈中第一个非0数字的位置,构建最终的数组 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("1593212",3)); System.out.println(removeKDigits("30200",1)); System.out.println(removeKDigits("10",2)); System.out.println(removeKDigits("541270936",3)); System.out.println(removeKDigits_1("159345434433212",1)); System.out.println(removeKDigits_1("1593212",3)); System.out.println(removeKDigits_1("30200",1)); System.out.println(removeKDigits_1("10",2)); System.out.println(removeKDigits_1("541270936",3)); System.out.println(removeKDigits_1("159345434433212",1)); } }
    Processed: 0.013, SQL: 8