有一十进制正整数,移除其中的 K 个数,使剩下的数字是所有可能中最大的。
假设:
字符串的长度一定大于等于 K
字符串不会以 0 开头
一行由正整数组成的数字字符串,和一个正整数 K,两个数据用空格隔开,如:1432219 3。
字符串长度不超过2000,K<=2000。
移除 K 位后可能的最大的数字字符串。
如 1432219 移除 1, 2, 1 这 3 个数字后得到 4329,为所有可能中的最大值。
1432219 3
4329
ss ,k= input().split()
k,nums= int(k),[]
for d in ss:
nums.append(d)
stack,i = [],0
while k>0 and i<len(nums):
if (stack and nums[i]<=stack[-1])&nbs***bsp;not stack:
stack.append(nums[i])
i+=1
elif stack and nums[i]>stack[-1]:
stack.pop()
k-=1
if k==0:
stack+=nums[i:]
else:
stack = stack[0:-k]
print(''.join(list(map(str,stack))))
if __name__ == "__main__":
s, K = raw_input().strip().split()
s = list(s)
k = int(K)
ans = [s[0]]
for i in s[1:]:
while ans and k>0:
if i>ans[-1]:
ans.pop()
k -= 1
else:
break
ans.append(i)
if k>0:
ans = ans[:-k]
print(''.join(ans)) """"
找到[0,K]区间内最大值对应的第一个下标 idx,
移除idx之前的所有数字,更新K = K-idx,保留idx对应的数字,对idx之后的数字串重复上一步骤
例如:输入 41681991713273619813 10 输出 9977619813
对s[0:10] 求最大值对应下标 idx=5,
移除s[0:5),K=10-5=5 ,输出s[idx]即9,对s[6:end)重复操作
对s[6:6+5] 求 idx=0,移除s[6:6+idx)即此次不移除,输出s[6+idx]即9,对s[7:end)重复操作
对s[7:7+5] 求 idx=1,移除s[7:7+idx),K=5-1=4,输出s[7+idx]即s[8]=7,对s[9:end)重复操作
对s[9:9+4] 求 idx=3,移除s[7:7+idx),K=4-3=1,输出s[9+idx]即s[12]=7,对s[13:end)重复操作
对s[13:13+1] 求 idx=1,移除s[13:13+idx),K=1-1=0,输出s[13+idx]即s[14]=6,输出s[15:end)
"""
if __name__ == "__main__":
s, K = input().strip().split()
s = list(s)
K = int(K)
t = 0
ans = []
while K:
if K == len(s) - t:
t = len(s)
break
idx = s[t:t + K + 1].index(max(s[t:t + K + 1]))
ans.append(s[t + idx])
K -= idx
t += idx + 1
ans += s[t:]
print(''.join(ans))