lintcode_182. 删除数字
给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。
找到删除 k 个数字之后的最小正整数。
N <= 240, k <= N
样例
给出一个字符串代表的正整数 A 和一个整数 k, 其中 A = 178542
, k = 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转回字符串。