移除 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; } }