leetcode 402 Remove K Digits(移除k个数字 贪心)

版权声明:转载请声明文章出处和链接 https://blog.csdn.net/yysave/article/details/84260355

分析和思路:

就是说给一个字符串形式的正数,删除k个数字,使得字符串数字最小

贪心思路

那么就是每次删除一个数,每次保证高位最小。

java代码:

class Solution {
    public String removeKdigits(String num, int k) {
        if(k>=num.length())
            return "0";
        for(int i=0;i<k;i++){
            num=removeOnedigit(num);
        }
        //数字中有0出现
        int i=0;
        int length=num.length();
        while(i<length-1 &&num.charAt(i)=='0'){
            i++;
        }
        return num.substring(i);
    }
    String removeOnedigit(String str){
        int length= str.length();
        for(int i=0;i<length-1;i++){
            if(str.charAt(i)>str.charAt(i+1))
                return str.substring(0,i)+str.substring(i+1);//删掉i位置的字符
        }
        //如果一直是单调递增
        return str.substring(0,length-1);//每次删掉末尾的数
    }
}

如上,代码中时间我好像是83ms,只超过了9%的人,所以肯定有更快的做法,也许不调用函数直接写一个里面试试

开头一个if循环,判断k和字符串长度的关系,如果相等,直接返回0(因为全部删了,其实不用判断k>length也行,因为题上说默认k不会大于num字符串的长度,其实只用判断相等就行了)

然后删除k个数字,一个循环k次,每次调用removeOnedigit()

然后在removeOnedigit里面,遍历str字符串(也就是当前num字符串),如果遇到前一个字符大于后面一个字符,就把前面这个字符删掉,然后返回最新字符串(这个返回不是最终返回哦)

str.substring(0,i)+str.substring(i+1)

注意java的str.substring(i)是 取str从i位置到最后的子字符串(字符串从0位置开始)

str.substring(i,j)是取str从i位置到j-1位置的子字符串

如果循环到最后结束都没有返回,说明字符串内部数字是单调递增的,这样每次删掉最后一个数字就可以了(递增当然说明最后的数最大啦)

如果删除之后,字符串内前面有0存在,比如 20200,k=1,删除之后是0200

这个时候再加入一个while循环看有几个0,因为我们输出的有效数字是从第一位不是0的数开始的嘛,删掉这几个0就可以了,然后返回子串

注意,removeKdigits()中最后的返回值,才是最终我们输出的返回值,而且这个时候如果i=0说明num前面没有0,那么substing(0)就是num直接输出。

加油,现在只是贪心而已,还没有动态规划呢

稳住,我们能赢

猜你喜欢

转载自blog.csdn.net/yysave/article/details/84260355