本文共 1344 字,大约阅读时间需要 4 分钟。
思路:把原整数的所有数字从左向右比较,如果发现某一位数字大于它右边的数字,那么在删除该数字后,必定回使该数位的的值降低
以遍历数为外循环,以k作为内循环,使用栈的特性,让所有数字一个个入栈,当某个数字需要删除时,让数字出栈,最后,把栈的内容转化为字符串结果/** * 删除调整数的k个值后,或得删除后的最小值 * 思路:把原整数的所有数字从左向右比较,如果发现某一位数字大于它右边的数字,那么在删除该数字后,必定回使该数位的的值降低 * 以遍历数为外循环,以k作为内循环,使用栈的特性,让所有数字一个个入栈,当某个数字需要删除时,让数字出栈,最后,把栈的内容转化为字符串结果 * 时间复杂度:只对所有数字遍历了一次,遍历的时间复杂度是O(n),把栈转化为字符串的时间复杂度也是O(n),所以整个时间复杂度是O(n) * 空间复杂度:程序中利用栈来回溯遍历的数字和删除数字,所以程序的空间复杂度是O(n) */public class RemoveKDigists { public static String getRemoveKDigists(String numbers,int k){ //新整数的最终长度 = 原整数长度 - 看; int newLength = numbers.length() - k; //创建一个栈用于接收所有的数字 char[] stack =new char [numbers.length()]; int top = 0; for (int i=0;i0 && stack[top - 1]>c&& k >0){ top --; k--; } 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(getRemoveKDigists("1593212",3)); System.out.println(getRemoveKDigists("30200",1)); System.out.println(getRemoveKDigists("10",2)); System.out.println(getRemoveKDigists("541270936",3)); }}
转载地址:http://lqsvi.baihongyu.com/