首页 > 其他 > 详细

Lintcode: Delete Digits

时间:2015-02-06 07:01:08      阅读:308      评论:0      收藏:0      [点我收藏+]
Given string A representative a positive integer which has N digits, remove any k digits of the number, the remaining digits are arranged according to the original order to become a new positive integer. Make this new positive integers as small as possible.
N <= 240 and k <=N, 
Example
Given an integer A = 178542, k = 4

return a string "12"

这道题跟Leetcode里面的那道Next Permutation很像,那个题要找比一个数大的下一个数,于是从这个数的右边开始,找第一个递减的位置所在。这道题也是类似,只不过从这个数的左边开始,找第一个递减的位置所在。那道题是想要改动的影响最小,所以从右边开始扫描。这道题是想要改动的影响最大,所以从左边开始扫描。

这道题,删掉一个数,相当于用这个数后面的数代替这个数。所以后面这个数一定要比当前小才行。所以找的是第一个递减的位置,把大的那个数删了。

这样做一次就是找到了:删除哪一个数,使得剩下的数最小。对剩下的数再做k次,就可以找到删除哪k个数,使得剩下的数最小。这其实是一个Greedy算法,因为这样每做一次,得到的都是当前最优的结果。

看起来需要O(Nk)时间复杂度,但其实用一个Stack,再记录pop了几次,O(2N)就好了

 1 public class Solution {
 2     /**
 3      *@param A: A positive integer which has N digits, A is a string.
 4      *@param k: Remove k digits.
 5      *@return: A string
 6      */
 7     public String DeleteDigits(String A, int k) {
 8         Stack<Integer> st = new Stack<Integer>();
 9         int popCount = 0;
10         StringBuffer res = new StringBuffer();
11         for (int i=0; i<A.length(); i++) {
12             int num = (int)(A.charAt(i) - ‘0‘);
13             if (st.isEmpty()) st.push(num);
14             else if (num >= st.peek()) {
15                 st.push(num);
16             }
17             else {
18                 if (popCount < k) {
19                     st.pop();
20                     i--;
21                     popCount++;
22                 }
23                 else {
24                     st.push(num);
25                 }
26             }
27         }
28         while (popCount < k) {
29             st.pop();
30             popCount++;
31         }
32         while (!st.isEmpty()) {
33             res.insert(0, st.pop());
34         }
35         while (res.length() > 1 && res.charAt(0) == ‘0‘) {
36             res.deleteCharAt(0);
37         }
38         return res.toString();
39     }
40 }

 

Lintcode: Delete Digits

原文:http://www.cnblogs.com/EdwardLiu/p/4276260.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!