删数问题-贪心算法-Python

问题描述:

在给定的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))

发现问题,请留言指教哦

    原文作者:贪心算法
    原文地址: https://blog.csdn.net/XX_123_1_RJ/article/details/80413053
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞