删除数字

来源:互联网 发布:appscan 数据库 编辑:程序博客网 时间:2024/06/16 15:28

删除数字 Lintcode 182

已知:

给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。(找到删除 k 个数字之后的最小正整数, 并且 N <= 240, k <= N)

示例:

给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542, k = 4返回一个字符串 "12"

思路:

复杂的思路 ( 以A = "178542", k = 4为例 ):①首先,将K转化为剩余几个数字要取( 在这里取2 ),便于理解和函数迭代②178542需要取 ( A.length - K   = ) 两位数字,所以第一位是原字符串除最后一位外的非0最小数 ( 也就是说在17854中取十位)③函数迭代,A从当前取得最小值的位置开始迭代,要取的位数也减1④当要取的位数为0时 ( 终止条件), 返回空字符串

我起初的代码是:

public class Solution {    public String DeleteDigits(String A, int l) {        return calculate(A, A.length() - l, 0);    }    //remainLength指的是还要取几位数字    private String calculate(String A, int remainLength, int flag) {        if (remainLength == 0) {            return "";        }        char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray();        //index还特意分了能不能取0        int index = findMinIndex(cs, flag);        if (index == cs.length - 1) {            return A.substring(index);        } else {            return A.substring(index, index + 1)                    + calculate(A.substring(index + 1), remainLength - 1, 1);        }    }    private int findMinIndex(char[] cs, int flag) {        int minIndex = 0;        char minValue = cs[0];        for (int i = 1; i < cs.length; i++) {            if (cs[i] < minValue) {                if (flag == 0 && cs[i] == '0') {                    continue;                }                minIndex = i;                minValue = cs[i];            }        }        return minIndex;    }}

然而!!然而题目的意思是即使你取的字符串以0开头也是可以的,结果里去除开头所有0就可以了!!非常无奈,测试的时候才发现题意比我想的简单多了,修改代码如下:

public class Solution {public String DeleteDigits(String A, int l) {        return calculate(A, A.length() - l);    }    private String calculate(String A, int remainLength) {        if (remainLength == 0) {            return "";        }        char[] cs = A.substring(0, A.length() - remainLength + 1).toCharArray();        int index = findMinIndex(cs);        if (index == cs.length - 1) {            return deleteFrontZero(A.substring(index));        } else {            String temp = A.substring(index, index + 1);            if ("0".equals(temp))                return calculate(A.substring(index + 1), remainLength - 1);            return temp + calculate(A.substring(index + 1), remainLength - 1);        }    }    private String deleteFrontZero(String substring) {        char[] cs = substring.toCharArray();        int flag = -1;        for (int i = 0; i < substring.length() - 1; i++) {            if (cs[i] != '0') {                flag = i;                break;            }        }        if (flag == -1)            return substring.substring(substring.length() - 1);        return substring.substring(flag);    }    private int findMinIndex(char[] cs) {        int minIndex = 0;        char minValue = cs[0];        for (int i = 1; i < cs.length; i++) {            if (cs[i] < minValue) {                minIndex = i;                minValue = cs[i];            }        }        return minIndex;    }    }

诶,题意不清多花了好些时间,不过希望对您有所帮助,(;′⌒`)

原创粉丝点击