分析和思路:
就是说给一个字符串形式的正数,删除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直接输出。
加油,现在只是贪心而已,还没有动态规划呢
稳住,我们能赢