首页 > 试题广场 >

保留最大的数

[编程题]保留最大的数
  • 热度指数:57108 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。

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


输出描述:
输出保留下来的结果。
示例1

输入

325 
1

输出

35
示例2

输入

3253
1

输出

353
示例3

输入

3253
2

输出

53
num, cut = [n for n in input().split()]

num_list = list(num)
for i in range(int(cut)):
    num_list.remove(min(num_list))
    
print(''.join(num_list))
我想请问一下这个方法有没有什么问题
发表于 2019-09-14 11:17:11 回复(0)
def func1(n,cnt):
    '''
    n: str
    cnt: int
    '''
    c = cnt
    ch = ''  # 用以保存要保留的数字
    i = 0
    while c:
        if i+c == len(n):  # index i 后的数都要删
            return ch
        s = max(n[i:i+c+1])
        max_index = n.index(s,i)
        ch = ch + s
        c = c - len(range(i,max_index))
        i = max_index +1
    else:
        if i == len(n):  # i-1 为n最后一位数的index
            return ch
        else:
            ch = ch + n[i:]  # 已删除固定数目的数字,将n[i]后的字符保留
    return ch
发表于 2018-09-20 21:58:15 回复(0)
请检查是否存在语法错误或者数组越界非法访问等情况
case通过率为70.00%
def hanshu(s,n):
if n==0:
ls = [str(i) for i in s]
print(''.join(ls))
return
t = 0
for i in range(len(s)-1):
if s[i]<s[i+1]:
s.pop(i)
t = 1
break
if t==0:
s.pop()
hanshu(s,n-1)
l = list(map(int,input()))
n = int(input())
hanshu(l,n)
编辑于 2018-08-16 10:17:43 回复(0)
str=list(input().split())
cnt=int(input())
for i in range(cnt):
    index=0
    min=str[0]
    for j in range(1,len(str)-1):
        if str[j]<=min:
            index=j
            min=str[j]
    str.pop(index)
print(''.join(str))
求助,这段代码为什么无法通过啊?自己感觉逻辑没问题啊
发表于 2018-07-07 20:32:50 回复(0)

思路:
用一个栈记录答案,依次遍历给出的数。
    当满足栈不为空,且当前遍历数大于栈顶数,且删除了栈顶数后,剩下的未遍历的数的个数加上剩下的栈的深度要达到题目要求的保留数时,就删除栈顶,一直到不满足这几个要求之一。
    如果栈的深度小于题目要求,就把当前遍历数push入栈(因为前面没对栈深限制,没有此限制,会出现输出长度大于题目要求的答案长度)

N= input()
c = int(input())
len_N = len(N)
remain = len_N-c
ans = []
for i in range(len_N):
    while ans and (len(ans)+len_N-i)>remain and N[i]>ans[-1]:
        ans.pop()
    if len(ans)<remain:
        ans.append(N[i])
print(''.join(ans))
编辑于 2018-05-22 19:18:34 回复(0)
#复杂度O(n),从左至右,删除小于下一位的数,最后不够删除结尾数
number = list(input())
cnt = int(input())
l = len(number)#number长度
i = 0
while cnt > 0 and i < l-1: 
    if number[i] >= number[i+1]: #当前数字大于等于后一位数字时,跳过,继续往后比较
        i += 1
    else: #当前数字小于后一位数字时
        number.pop(i) #去掉当前数字
        cnt -= 1 #希望去掉的数字-1
        l -= 1 #number长度-1
        if i > 0: #当前位不是首位,则回退一位
            i = i - 1
        else: 
            i = 0
if cnt > 0: #数字前一位均大于等于后一位,且待删除数字个数大于0,直接去掉末尾的数
    number = number[:-cnt]
print(''.join(number))

发表于 2018-05-10 14:06:11 回复(0)
#通过90%,实在是想不到是哪里有问题
number = input()
cnt = int(input())
number = '_'.join(number)
number = number.split(sep = '_')
count = 0
k = 0
while True:#构造前数大于等于后数的列表,例如(9877655432100)
    if number[k] < number[k + 1]:#后一个比前一个数大就删除前一个数
        del number[k]
        count += 1
        if k > 0:#如果不是第一位则将比较点前移一位,例如(911113,删除3个)
            k -= 1
    else:#否则将比较点后移一位
        k += 1
    if count >= cnt or k >= len(number)-cnt:#是否已删除cnt个 或已经比较到最后
        break
a = [str(i) for i in number]
a.sort()
if count < cnt:#已经比较到最后但没有删除cnt个则删除相对小的,例如(987651000,删除3)
    for i in range(cnt-count):
        del number[number.index(a[i])]
print(''.join(number))

编辑于 2018-04-30 14:29:06 回复(0)
def getMax(n,k):
    res = []
    while k>0:
        if len(n)==k:
            n = []
            break
        maxN = max(n[:k+1])
        res.append(maxN)
        maxin = n.index(maxN)
        n = n[maxin+1:]
        k = k-maxin
    res.extend(n)
    return res

num = input()
k = int(input())
n = ' '.join(str(num)).split()
n = list(map(int,n))     
print(''.join([str(x) for x in getMax(n,k)]))
要删除的个数为k,找出前k+1个中最大者,必定不会被删除,然后删除最大者前面的所有数t个,继续对剩下的数中删除k-t个数,以此类推,直到没有要删除的
编辑于 2018-04-09 21:31:05 回复(1)
从左向又扫描number,每次比较后一个数与前一个数的大小,若后一个数比前一个数大,则说明该数为输出数的某一位,重复扫描工作,此时扫描无需重头开始,只需重删除数的前一个数开始即可,直到找到cnt个这样的数,输出最终值;若扫描完均为发现后一个数比前一个数大说明,该number各位为降序,此时只需不断从尾部删除数,直到剩余位数为cnt就行,打印输出。
通过率100%,运行29ms~52ms(受网络影响),占用空间2940K,python代码如下:

def reserve_max():
    number = raw_input()
    cnt = raw_input()
    length = 0
    if number.isdigit():
        length = len(number)
    if cnt.isdigit():
        cnt = int(cnt)
    if isinstance(cnt,str) or length<1 or length>50000 or cnt<1 or cnt>length:
        print False
    else:
        idx = 0
        while cnt:
            flag = False
            i = idx
            while i<len(number)-1:
                if number[i]<number[i+1]:
                    number = number[:i]+number[i+1:] if i!=0 else(number[i+1:])
                    flag = True
                    idx = i-1 if i!=0 else(i)
                    break
                i+=1
            if not flag:
                number = number[:-1]
                idx = len(number)
            cnt-=1
        print number
发表于 2018-04-02 19:48:58 回复(0)
number = raw_input()
n = int(raw_input())
str = ''
while n:
    if len(number) == n:
        number = ''
        break
    m = max(number[:min(n + 1, len(number))])
    index = number.index(m)
    n = n - index
    str = str + m
    number = number[index + 1:]

print(str + number)

发表于 2018-03-29 15:44:49 回复(0)

"""
可以通过所有案例
"""
def max_num(num, count):
    i = 0
    j = len(num) - 1
    while i+1 <= j and count > 0:
        if num[i] < num[i+1] and i >= 0:
            num.pop(i)
            i -= 1
            j -= 1
            count -= 1
        else:
            i += 1
    while count > 0:
        num.pop(-1)
        count -= 1
    return ''.join(num)
                

if __name__ == "__main__":
    num = list(input())
    count = int(input())
    print(max_num(num, count))

发表于 2018-03-07 13:43:33 回复(0)
提交了好多遍都是不过,感觉应该是他的case有问题,后来复制了通过的代码,试了一下,感觉他这个代码有问题,我觉得答案应该是错误的:
对于那个397......那个case,通过的答案跑出来的结果是错的,事实证明这个题的case就有问题,不纠结了。。

发表于 2018-02-09 16:42:20 回复(0)
userinput = str(input())
targetnumber = int(input())
digitremoved = 0

if(len(userinput)>1 or len(userinput)<1000):
    if(targetnumber>1 or targetnumber<len(userinput)):
        while(digitremoved<targetnumber):
            target=userinput.index(min(userinput))
            userinput = userinput[:target]+userinput[target+1:]
            digitremoved+=1

print(userinput)

求指导,为什么会超时?
发表于 2018-01-22 00:42:25 回复(0)
思路:从高位向低位移动,每次将该位数字压入一个新栈,但在压入新元素前,不断弹出栈顶元素直至栈顶元素不小于即将压入的新元素或者弹出元素数量已经达成目标,直至迭代器遍历了整个列表。如果此时弹出元素数仍未满足要求,将后几位舍去即可。
num = str(input())
abd = int(input())
a = list(map(int,num))
b = []
n = 0
it = iter(a)
while True:
    try:
        val = it.__next__()
        while (n<abd and len(b)>0 and b[len(b)-1] < val):
            b.pop()
            n = n+1
        b.append(val)
    except StopIteration:
        break
if (n<abd):
     b = b[:n-abd]
print ("".join(str(i) for i in b))


编辑于 2018-03-26 16:47:23 回复(0)
#好像只有40%,不知道哪里出现问题
num_lists = [num for num in input()]
count, init = int(input()), 0
while init < count:
    for a in range(len(num_lists) - 1):
        if int(num_lists[a + 1]) > int(num_lists[a]):
            num_lists.remove(num_lists[a])
            break
    else:
        num_lists.remove(num_lists[len(num_lists) - 1])
    init += 1
print("".join(num_lists))

发表于 2017-11-21 19:21:41 回复(0)
 nums = list(input())
cnt = int(input())
n, j, i= len(nums), cnt, 0
while j > 0 and i < n-1:
    if nums[i]>= nums[i+1]:
        i += 1
    else:
        nums.pop(i)
        j -= 1
        n -= 1
        i = i-1 if i > 0 else 0
if j > 0:
    nums = nums[:-j]
print(''.join(nums)) 
复杂度O(n),从左至右,删除小于下一位的数,最后不够删除结尾数
编辑于 2017-09-22 17:24:30 回复(14)
通过40%  该考虑的都考虑了,基本都是单趟循环,应该时间复杂度不大啊,但是显示运行超时
#/usr/bin/env python
#coding:utf-8
li = []
num = int(raw_input())
x = int(raw_input())
strs = ''
while num !=0 :
        i = num % 10
        num //= 10
        li.append(i)
li.reverse()
def func(arg):
    length = len(arg)
    for i in range(length-1):
            if arg[i] < arg[i+1]:
                    del arg[i]
                    break
    if length == len(arg):
            arg.pop()
    return arg
for k in range(x):
        num = func(li)
for j in num:
        strs += str(j)
print strs
发表于 2017-09-08 13:48:10 回复(0)
number = input()
cnt = input()
num = list(str(number))
for i in range(cnt):
    num.remove(min(num))
print eval(''.join(num))

然而提示算法复杂度过大....
发表于 2017-08-29 17:17:15 回复(0)
import math
number = raw_input()
c = int(raw_input())
n = int(number)
while c!=0:
    new = min(int(x) for x in number)
    number = number.replace(str(new),"",1)
    c-=1
print number
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为20.00%
求大神指导!!


发表于 2017-08-10 19:53:52 回复(0)