牛客网在线编程(8):保留最大的数-python

 

题目描述

给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。

输入描述:

输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。

输出描述:

输出保留下来的结果。

示例1

输入

325 
​​​​​​​1

输出

35

代码实现

import sys

lines=sys.stdin.readlines()

Str=lines[0].strip()
num=int(lines[1])
def func(s,start):
    for i in range(start,len(s)-1):
        if s[i]<s[i+1]:
            return s[:i]+s[i+1:],max(0,i-1)
    return s[:-1],len(s)
start=0
for i in range(num):
    Str,start=func(Str,start)
print(Str)

原理说明

先举个更加普遍的例子743532,去掉4个数字,结果是75

首先,我们先遍历这个数字字符串,当前数字i小于下个数字i+1,去除i,那么下次去除数字时,从i-1开始遍历,例如我们例子中,去除的第一数字就是5前面的3,得到74532,下次从4处开始遍历(不从头遍历是为了降低复杂度),第二个去除的数字是4,得到7532,第三个是2,得到753,那么问题来了,现在整个数字是按位递减的(有时候有相等的时候,比如7553,这些都不影响后面的计算),第四个数字就去除最后一个数字,程序中返回len(s)是为了下次进入函数时,不进入循环体。最后要解释的是max(0,i-1),我们不是要从i-1开始遍历吗?但是有可能i=0,为了解决这种情况,我们使用max(0,i-1)来进行所有情况的统一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值