刪數問題:

給定一個n位正整數a,刪掉其中任意k(k<=n)個位,剩下的爲按原順序形成一個新的正整數。

找出剩下的數字最小的刪樹方案。

輸入:a>0,n位,0<k<=n。

輸出:最小的剩下的數。

貪心策略:

最近下降點優先。

自左向右逐位掃描數字a,找到第i位,使得a[i]>a[i+1],那麼刪掉第i位後,剩下的是當前數字刪掉1位後的最小值。

迭代k次,刪掉k位即可。

例子:

輸入:a=178543,k=4

178543 -> 17543 -> 1543 -> 143 -> 13


代碼實現:

  1. /** 
  2.  * 刪數問題 
  3.  * 給定一個n位正整數a,刪掉其中任意k(k<=n)個位,剩下的爲按原順序形成一個新的正整數。 
  4.  * 找出剩下的數字最小的刪樹方案。 
  5.  * @author xuefeng 
  6.  */  
  7. public class RemoveNumBits {  
  8.     // ignore exceptions  
  9.     public static int RNB(int a, int k) {  
  10.         StringBuffer sb = new StringBuffer(a + "");  
  11.         int i, j;  
  12.         for (i = 0; i < k; i++) {  
  13.             for (j = 0; j < sb.length() - 1  
  14.                     && sb.charAt(j) <= sb.charAt(j + 1); j++) {  
  15.             }  
  16.             sb.delete(j, j + 1);  
  17.         }  
  18.   
  19.         return sb.length() == 0 ? 0 : Integer.parseInt(sb.toString());  
  20.     }  
  21.   
  22.     public static void main(String[] args) {  
  23.         int min = RNB(1785436);  
  24.         System.out.println(min);  
  25.     }  
  26. }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章