给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :
输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :
输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。
题目要求:移掉k个数字,使得剩下的数字最小;本质是局部重复性的变化问题,每次在可选范围内移掉一个数字,每移掉一个最小数字;如此往复。
题目本质:贪心问题,明确局部问题,每次做出局部最优解;开始index,遍历长度,最小值,最小值所在的index,遍历边界;
应用:贪心问题,重复性处理的问题,局部方法一样,条件有变化的如此处理。
问题:开始为0的处理,处理一批情况。每次局部处理可选的范围大小。
package com.jd.jr.nlp;
import java.util.ArrayList;
import java.util.List;
/**
* while遍历,确定可选范围 内的最小数,
* 之后根据最小数下移,如此往复
*
*
*/
public class Solution402Diy {
public String removeKdigits(String num, int k) {
if(k==0){
return num;
}
if(num.length()==k){
return "0";
}
int[] digits=new int[num.length()];
for(int i=0;i<num.length();i++){
digits[i]=Integer.valueOf(num.substring(i,i+1));
}
List<Integer> minDigits=new ArrayList<>();
// int differNum=num.length()-k+1;
int differNum=k+1;
int i=0;
int s=0;
int minNumValue=Integer.MAX_VALUE;
int minNumPosition=-1;
while (true){
if(minDigits.size()==num.length()-k){
break;
}
if(i-s<differNum) {
if (digits[i] < minNumValue) {
minNumPosition = i;
minNumValue = digits[i];
}
}else {
minDigits.add(minNumValue);
s=minNumPosition+1;
i=minNumPosition;
minNumValue=Integer.MAX_VALUE;
minNumPosition=-1;
// differNum=num.length()-s-minDigits.size()+1-(num.length()-k-minDigits.size());
differNum=num.length()-s-(num.length()-k-minDigits.size()-1);
}
i++;
}
StringBuilder sb=new StringBuilder();
for(i=0;i<minDigits.size();i++){
if(i==0 && minDigits.size()==1 && minDigits.get(i)==0){
return "0";
}else if(sb.length()==0 && minDigits.get(i)==0){
continue;
}
sb.append(minDigits.get(i));
}
return sb.length()==0? "0": sb.toString();
}
public static void main(String[] args){
Solution402Diy solution402Diy=new Solution402Diy();
String num = "1432219";
int k = 3;
// num = "10200";
// k = 1;
// num = "10";
// k = 2;
// num="10";
// k=1;
// num="0";
// k=0;
// num="1107";
// k=1;
String resultLeft=solution402Diy.removeKdigits(num,k);
System.out.println("===============resultLeft===============");
System.out.println(resultLeft);
}
}