当前位置:首页 > 未命名 > 正文内容

移除 K 位得到最小值

淙嶙5年前 (2020-07-22)未命名1003

描述


有一行由正数组成的数字字符串,移除其中的 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;
}
}

相关文章

使用void方法交换两个Integer整数

使用void方法交换两个Integer整数

前提条件:1.参数的传递方式:值传递和引用传递,其中值传递为基础数据类型,引用传递为 对象,数组,集合等2.注意,这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们...

...

出现频率最高的前 K 个元素

出现频率最高的前 K 个元素

描述 有一个不为空且仅包含正整数的数组,找出其中出现频率最高的前 K 个数,时间复杂度必须在 O(n log n) 以内。 输入 一行数据包括两部分,一个正整数数组(数字间 ',' 分隔)和一个正整...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。