删除数字

删除数字 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;
    }
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值