贪心算法
题目:给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
算法分析:
因为最高位的数据要越小越好,所以从最高位开始判断,当下一个数据小于上一位时,可以把当前数据给删除,例如添加完14后,3比4要小,就应该保留3把4给移除,也有可能会出现123456这样的顺序数据,那就从最后的位数开始删除操作就行了。可以用栈来对数据进行储存,把第一个数据存入栈中,只要接下来的数据小于栈顶的数据,那就把栈顶的数据弹出,k- -;
具体代码实现为:
class Solution {
public String removeKdigits(String num, int k) {
if(k >= num.length()){
return "0";
}
Stack<Integer> stack = new Stack<>();
int i = 0;
for(;i < num.length(); i++){
if(k == 0){
break;
}
int val = num.charAt(i) - '0';//取字符串的ASCII码
while(!stack.isEmpty()&& val < stack.peek() && k>0){
stack.pop();
k--;
}
if(!stack.isEmpty() || val != 0){
stack.push(val);
}
}
while(k>0){ //当字符串为逆序排列时,从尾部删除k个数字
stack.pop();
k--;
}
StringBuilder str = new StringBuilder();//使用可变序列字符串
while(!stack.isEmpty()){
str.insert(0,String.valueOf(stack.pop()));
}
if(i < num.length()){ //如果k提前为0,只需要把num的剩余数据进行拼接
str.append(num.substring(i));
}
return str.length() == 0? "0":str.toString();
}
}