删除K个数字后的最小值(贪心算法实现)

时间:2019-09-13
本文章向大家介绍删除K个数字后的最小值(贪心算法实现),主要包括删除K个数字后的最小值(贪心算法实现)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字?
其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。
 
思路:
把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。这种求局部最优解,最终得到全局最优解的思想,叫作贪心算法
如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,否则就直接将数字压栈。当出栈的数字达到k个时,将剩下的数字全部入栈即可。
 
举例:"541270936",去除3个数字。
  1. 5入栈,stack=[5]
  2. 4入栈,判断4<5,5出栈,4入栈。stack=[4]。出栈一次,num=1
  3. 1入栈,判断1<4,4出栈,1入栈。stack=[1]。出栈一次,num=2
  4. 2入栈,判断2>1,2直接入栈。stack=[1,2]
  5. 7入栈,判断7>2,7直接入栈。stack=[1,2,7]
  6. 0入栈,判断0<7,7出栈,0入栈。stack=[1,2,0]。出栈一次,num=3。此时出栈了3次,相当于去除了3个数字。满足要求。那么剩下的字符就直接入栈就可以了。
  7. 剩余字符全部入栈。stack=[1,2,0,9,3,6]

代码实现:

 1 package blogSrc;
 2 
 3 import com.sun.deploy.util.StringUtils;
 4 
 5 import java.util.Arrays;
 6 import java.util.Stack;
 7 
 8 /**
 9  * 删除K个数字后的最小值
10  *
11  * 给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字?
12  * 其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。
13  *
14  * 思路:把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。
15  * 如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,否则就直接将数字压栈。
16  * 遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,当出栈的数字达到k个时,
17  * 将剩下的数字全部入栈即可。
18  */
19 public class GetMinAfterRemoveKDigits {
20 
21     public static void main(String[] args){
22         String originStr = "541270936";
23         String newStr = new GetMinAfterRemoveKDigits().getMinAfterRemoveKDigits(originStr,3);
24         System.out.println("OldString is: " + originStr);
25         System.out.println("NewString is: " + newStr);
26     }
27 
28     public String getMinAfterRemoveKDigits(String originStr, int k){
29         char[] originArr = originStr.toCharArray();
30         Stack<Character> stack = new Stack<>();
31         stack.push(originArr[0]);
32         int num = 0;
33         for (int i=0; i<originArr.length; i++){
34             if (num == k){
35                 stack.push(originArr[i]);
36             }else {
37                 if (originArr[i] <= stack.peek()) {
38                     stack.pop();
39                     stack.push(originArr[i]);
40                     num++;
41                 }else {
42                     stack.push(originArr[i]);
43                 }
44             }
45 
46         }
47 
48         StringBuffer result = new StringBuffer();
49         for (int i=0; i<stack.size(); i++){
50             result.append(stack.get(i));
51         }
52         return result.toString();
53     }
54 }

结果:

OldString is: 541270936
NewString is: 1270936
 

原文地址:https://www.cnblogs.com/zldmy/p/11517369.html