lintcode_182. 删除数字

给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。

找到删除 k 个数字之后的最小正整数。

N <= 240, k <= N

样例

给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542k = 4

返回一个字符串 "12"

思路:

贪心策略,先删一位再删下一位,直至k位。问题是选则删除哪一位。

要使剩余的数字仍然按照原来的顺序排列最小,即删除后一位比当前位小的位,如"1321"则应删除"3" -> "121"。

由于删完一位后,前一位可能比后一位要大了,如"5631" 若要继续删除,则应先删除“6”->"531"再删除"5"->"31"。所以考虑可以使用双重循环,外循环迭代删除次数,内循环遍历当前字符串

内循环若从字符串初始开始搜索,时间复杂度为O(N*k),考虑简化从删除位的前一位遍历

最后,考虑字符串为正序后,删除数没达到k位,则删除最后几位

class Solution:
    """
    @param: A: A positive integer which has N digits, A is a string
    @param: l: Remove k digits
    @return: A string
    """
    def DeleteDigits(self, A, l):
        # write your code here
        num = len(A) #删除位数    
        ans = ""
        j = 0
        
        for i in range(l):
            while j < len(A) - 1:
                if A[j] > A[j+1]:
                    A = A.replace(A[j],'',1)
                    j = j-1 if j > 0 else 0
                    break
                else:
                    j += 1
        
        ans = A[:num-l] #若正序后删除位置不够,则删最后几位
        for i in range(len(ans)): 
            if ans[i] != '0':
                return ans[i:] #去除高位0

 

九章参考:

class Solution:
    """
    @param A: A positive integer which has N digits, A is a string.
    @param k: Remove k digits.
    @return: A string
    """
    def DeleteDigits(self, A, k):
        # write you code here
        A = list(A)
        while k > 0:
            f = True
            for i in xrange(len(A)-1):
                if A[i] > A[i+1]:
                    del A[i]
                    f = False
                    break     
            if f and len(A)>1:
                A.pop()
            k -= 1
        while len(A)>1 and A[0]=='0':
            del A[0]
        return ''.join(A)   
 

先将字符串数组转化为list,就可以使用del删除当前字符,最后用''.join()可以将list转回字符串。

posted @ 2017-12-20 19:24  Tom_NCU  阅读(155)  评论(0编辑  收藏  举报