首页 > 其他 > 详细

整数构成的字符串删除K个字符后,剩余字符对应的整数值最小

时间:2020-08-17 12:27:30      阅读:76      评论:0      收藏:0      [点我收藏+]

输入一串整数构成的字符串,和一个整数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]]))

 

整数构成的字符串删除K个字符后,剩余字符对应的整数值最小

原文:https://www.cnblogs.com/sunupo/p/13516676.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!