输入一串整数构成的字符串,和一个整数K,从字符串中随即删除K个字符,使得剩下的字符按照原来顺序构成的整数最小。
输入:
第一行 整数构成的字符串
第二行是一个整数K
K小于字符串长度
输出:删除K个字符后剩下的字符串
举例:
输入: 100 1 输出: 0
输入: 12345 1 输出: 1234
输入 3753219382 2 输出 35321382
1.代码如下:
import copy def get_first_inv(tmp): cur_ele = sorted(tmp[:k], key=lambda x: x[1])[0] flag=False for ele in sorted(tmp[:k], key=lambda x: x[1]): if ele[0] < cur_ele[0]: flag=True break else: cur_ele = ele return flag,cur_ele if __name__ == ‘__main__‘: # dd=[[1,0],[2,1],[3,2]] # print(list(zip(*dd))[0]) # exit() string = ‘12453233708‘#input() k=4#int(input()) # string=‘1683212‘ # k=3 data=[] for idx,i in enumerate(string): data.append([int(i),idx]) sort_data=sorted(data, key=lambda x:[-x[0],x[1]]) tmp=copy.deepcopy(data) # data的备份tmp tmp_idx=[] # 记录删除的元素 for i in sort_data[:k]: tmp_idx.append(i) #添加删除的元素到记录中 tmp.remove(i) # tmp移除删除元素 sort_tmp = sorted(tmp[:k]) print(sort_tmp,"\t",tmp,"\t",tmp_idx) flag,first = get_first_inv(tmp) print("flag,first,tmp",flag,first,tmp) cnt=0 while flag: cnt+=1 # 如果不是非递减序列,# 看看删除的元素是否有在剩下前面K个元素的后边 if sorted(tmp[:k], key=lambda x: x[1])[-1][1]>sorted(tmp_idx[:k], key=lambda x:x[1])[-1][1]: # 如果没有,结束 break else: #if tmp[:k][-1][1]<tmp_idx[:k][-1][1]: #如果有,把剩余元素前K个中最大的元素(出现逆序的元素中第一个删除)删除,保留后面那个曾经被删除的元素,保留谁需要判断 judge = [] ‘‘‘ [[[1,0],[2,1],[3,2]],[[1,0],[2,1],[3,2]],[[1,0],[2,1],[3,2]]]‘‘‘ # for ele in tmp[k:]: last_del_ele = [] tmp_idx_copy = copy.deepcopy(tmp_idx) for de in tmp_idx_copy: if de[1] > sorted(tmp[:k], key=lambda x: x[1])[-1][1]: tmp_idx[:k].remove(de) last_del_ele.append(de) print(tmp[k:]) dd = copy.deepcopy(tmp[k:]) dd.append(de) judge.append(dd) print("tmp_idx, last_del_ele, judge,tmp", tmp_idx, last_del_ele, judge,tmp) ss = sorted(judge, key=lambda x: int("".join([str(ele) for ele in list(zip(*x))[0]])))[-1] left = 0 for idx, ele in enumerate(judge): if ele == ss: left = idx # last_del_ele[idx] 这个元素需要保留下来 print("tmp,last_del_ele[idx]",tmp,last_del_ele[idx]) try: tmp.remove(first) # 删除前面K个元素第一次出现逆序的元素,eg:11323564,删除3 except: print("first 不存在",first) pass tmp_idx.remove(last_del_ele[left]) tmp.append(last_del_ele[left]) print("tmp.append(last_del_ele[left])",tmp) print("第",str(cnt),"".join([str(ele) for ele in list(zip(*sorted(tmp, key=lambda x: x[1])))[0]])) flag, first = get_first_inv(tmp) print("last=","".join([str(ele) for ele in list(zip(*sorted(tmp, key=lambda x: x[1])))[0]]))
原文:https://www.cnblogs.com/sunupo/p/13516676.html