问题描述:
在给定的n个数字的数子串,删除其中k(k<n)个数字后,剩下的数字按照原次序组成一个新的正整数。使得剩下的数字组成的新正整数最大。
问题分析:
贪心思想,每次从左到右,删除第一个小于后者的元素,如果没有,说明是已经降序排列,就从后面依次删除。(如果是要的是最小值则反之)
方法一:Python3实现:
# @Time :2018/5/22
# @Author :Yinxing
def delNum(s, k):
n = len(s)
if n<k: return None
s = list(s)
flag = 0
while k != 0:
if flag == 0:
for i in range(len(s) - 1): # 发现第一个小于后一个值的数字删除
if s[i] < s[i + 1]:
del s[i]
k -= 1
flag = 1
break
if flag == 1 and k != 0: # 已经删除,但没有结束
flag = 0
else: # 已经遍历完,但没有发现前一个小于后一个的,从后面依次删除
n = len(s)
s = s[:n-k]
k = 0
return ''.join(s)
if __name__ == '__main__':
s, k = '494326', 3
print(delNum(s, k))
方法二:Python3实现:
上面方法,会遍历K次数列,如果使用栈来操作,那么就可以完成一次遍历。
# @Time :2018/05/22
# @Author :LiuYinxing
# 栈操作
def delNum(Num, k):
n = len(Num)
if n < k: return None
stack = []
for s in Num:
if not stack:
stack.append(s)
continue
if k > 0:
while k > 0 and stack:
if stack[-1] < s:
stack.pop()
k -= 1
else:
break
stack.append(s)
if k != 0:
return ''.join(stack[:-k])
return ''.join(stack)
if __name__ == '__main__':
s, k = '494326', 3
print(delNum(s, k))
发现问题,请留言指教哦