給出一個整數,從該整數中去掉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