移除 K 位得到最小值
描述
有一行由正数组成的数字字符串,移除其中的 K 个数,使剩下的数字是所有可能中最小的。
假设:
字符串的长度一定大于等于 K
字符串不会以 0 开头
输入
一行由正整数组成的数字字符串,和一个正整数 K,两个数据由英文逗号隔开,如:1432219,3。
输出
移除 K 位后可能的最小的数字字符串。
如 1432219 移除 4, 3, 2 这 3 个数字后得到 1219,为所有可能中的最小值。
输入样例
1432219,3
10200,1
输出样例
1219
200
private static String solution(String line) {
// 在此处理单行数据
// 在此处理单行数据
String a[] = line.split(",");
String str = a[0];
int count = Integer.parseInt(a[1]);
Node n = new Node(str.charAt(0)-48);
int arr[] = new int[str.length()-1];
for (int i = 1; i < str.length() ; i++){
char c = str.charAt(i);
arr[i-1] = (c - 48);
}
n.addNode(arr, 0);
Node root = n.deleteNode(count);
// 返回处理后的结果
return root==null?"0":root.nodeToStr();
}
static class Node {
Node left;
Node right;
Node parent;
int data;
public Node(int data){
this.data = data;
}
public Node addNode(int[] a, int index){
Node p = this;
Node n = new Node(a[index]);
n.parent = p;
if (p.data > a[index]){
p.left = n;
if(++index < a.length){
p.left.addNode(a, index);
}
}else{
p.right = n;
if(++index < a.length){
p.right.addNode(a, index++);
}
}
return n;
}
public String nodeToStr(){
StringBuilder sb = new StringBuilder();
Node n = this;
while(n != null){
sb.append(n.data);
if(n.left!=null){
n = n.left;
}else{
n = n.right;
}
}
return sb.toString();
}
public Node deleteNode(int count){
Node p = this;
Node root = this;
while(count > 0 && p !=null){
if(p.right != null){
p = p.right;
continue;
}else{
if(p.left != null){
if(p.parent != null){
if(p.parent.data > p.left.data){
p.left.parent = p.parent;
p.parent.left = p.left;
p = p.parent;
p.right = null;
}else{
p.left.parent = p.parent;
p.parent.right = p.left;
p = p.left;
}
}else{
p = p.left;
while(p != null && p.data == 0){
if(p.right != null){
p = p.right ;
}else{
p = p.left;
}
}
root = p;
if(p != null){
p.parent = null;
}
}
count--;
}else{
break;
}
}
}
return root;
}
}


