给出一个整数,从该整数中去掉k个数字,要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字?
其中,整数的长度大于或等于k,给出的整数的大小可以超过long类型的数字范围。
思路:
把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它右面的数字,那么在删除该数字之后,必然会使该数位的值降低。这种求局部最优解,最终得到全局最优解的思想,叫作“贪心算法”。
如果要删除k个数字,那么将遍历数字作为外层循环,以k作为外层循环,再结合栈的使用。将遍历的数字逐个入栈,遇到入栈进来的数字小于栈顶的数字时,将栈顶的数字出栈,再将该遍历的数字入栈,否则就直接将数字压栈。当出栈的数字达到k个时,将剩下的数字全部入栈即可。
举例:"541270936",去除3个数字。
- 5入栈,stack=[5]
- 4入栈,判断4<5,5出栈,4入栈。stack=[4]。出栈一次,num=1
- 1入栈,判断1<4,4出栈,1入栈。stack=[1]。出栈一次,num=2
- 2入栈,判断2>1,2直接入栈。stack=[1,2]
- 7入栈,判断7>2,7直接入栈。stack=[1,2,7]
- 0入栈,判断0<7,7出栈,0入栈。stack=[1,2,0]。出栈一次,num=3。此时出栈了3次,相当于去除了3个数字。满足要求。那么剩下的字符就直接入栈就可以了。
- 剩余字符全部入栈。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
时间: 2024-11-06 07:20:44