鱼C论坛

 找回密码
 立即注册
查看: 4372|回复: 69

[已解决]Python:每日一题 383

[复制链接]
发表于 2020-4-23 18:46:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2020-4-23 18:46 编辑

今天的题目:


给定一个以字符串表示的非负整数 num,移除 num 中的 k 位数字,使得剩下的数字最小。

以字符串形式返回 num 移除 k 位数字后的数字。

示例 1:

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 。
示例 2:

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1,剩下的数字为 200,注意输出不能有任何前导零。
示例 3:

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0。


欢迎大家一起答题!
最佳答案
2020-4-23 18:55:42
本帖最后由 kinkon 于 2020-4-24 09:01 编辑

原地修改字符串
def f383(s, k):
    if len(s) <= k:
        return '0'
    l = 0
    while k > 0 and l < len(s) - 1:        
        if s[l] > s[l + 1]:
            s = s.replace(s[l], '', 1)
            k -= 1
        else:            
            l += 1
        while l > 0 and s[l-1] > s[l]:
            l -= 1
    s = s[:-k] if k else s
    return s.lstrip('0') or  '0'
转列表修改
def f383(s, k):
    if len(s) <= k:
        return '0'
    s = list(s)
    l = 0
    while k > 0 and l < len(s) - 1:            
        if s[l] > s[l + 1]:
            s.pop(l)
            k -= 1
        else:            
            l += 1
        while l > 0 and s[l-1] > s[l]:
            l -= 1
    s = s[:-k] if k else s
    return ''.join(s).lstrip('0') or '0' 

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 18:53:21 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 18:55:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 kinkon 于 2020-4-24 09:01 编辑

原地修改字符串
def f383(s, k):
    if len(s) <= k:
        return '0'
    l = 0
    while k > 0 and l < len(s) - 1:        
        if s[l] > s[l + 1]:
            s = s.replace(s[l], '', 1)
            k -= 1
        else:            
            l += 1
        while l > 0 and s[l-1] > s[l]:
            l -= 1
    s = s[:-k] if k else s
    return s.lstrip('0') or  '0'
转列表修改
def f383(s, k):
    if len(s) <= k:
        return '0'
    s = list(s)
    l = 0
    while k > 0 and l < len(s) - 1:            
        if s[l] > s[l + 1]:
            s.pop(l)
            k -= 1
        else:            
            l += 1
        while l > 0 and s[l-1] > s[l]:
            l -= 1
    s = s[:-k] if k else s
    return ''.join(s).lstrip('0') or '0' 

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 18:58:48 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-23 19:09:32 | 显示全部楼层
str = input()
k = int(input())

for i in range(k):
    max_num = max(str)
    j = 0
    while True:
        if str[j] == max_num:
            str = str[0:j] + str[j + 1:len(str)]
            break
        j += 1

print(str)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 19:27:05 | 显示全部楼层
本帖最后由 xiangjianshinan 于 2020-4-26 14:49 编辑
'''
给定一个以字符串表示的非负整数 num,移除 num 中的 k 位数字,使得剩下的数字最小。
以字符串形式返回 num 移除 k 位数字后的数字。
示例 1:
输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 。
示例 2:
输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1,剩下的数字为 200,注意输出不能有任何前导零。
示例 3:
输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0。
解析题意:
问题:怎样移除K位的数字,使得剩下的数字最小?
1、首先不能否认,我们需要移除高位的数才能令数值最小;
2、于是将s的前K+1位数字比较后,留下最小值即可。
过程如下:
'''
def timu383(s,k):
    if len(s)<=k:
        return '0'
    else:
        ls = list(s)                #输入:num = '112', k = 1  输出:'12'    预期结果:'11'  20200426 14:45
        for i in range(k):
            ls.remove(max(ls))
        ta = int(''.join(ls))
        tb = int(min(s[:k+1])+s[k+1:])
        tc = ta if ta<= tb else tb
        return str(tc)
num = "1432219"
k = 3
print(timu383(num,k))
num = "10200"
k = 1
print(timu383(num,k))
num = "10"
k = 2
print(timu383(num,k))
num = '112'
k = 1
print(timu383(num,k))
print('done!')
=======================
#输入:num = '112', k = 1  输出:'12'    预期结果:'11'  20200426 14:45修改
通过全部子串去取最大值后,与按逻辑去除前面的内容 比较后,输出小的结果的方式处理。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 19:45:20 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-24 20:42 编辑
def fun383(num,k):
    M = len(num)
    bits = M - k
    if bits <= 0:
        return '0'
    result = ''
    for bit in range(bits-1,0,-1):
        minChar = min(num[:(-bit)])
        p = num.index(minChar)
        result += minChar
        num = num[(p+1):]
    minChar = min(num)
    result += minChar
    return str(int(result))

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:06:12 | 显示全部楼层
终于有大师的感觉啦~~~

我飘啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:12:29 | 显示全部楼层
本帖最后由 fan1993423 于 2020-4-24 16:36 编辑
def fun383(num,k):
    d=num[:]
    d=d.replace('0','')
    if len(d)<=k: return '0'
    if num==''.join(sorted(num)):return num[:-k]
    while k>0:
        for i in range(len(num)-1):
            if num[i]>=num[i+1]:
                num=num.replace(num[i],'',1)
                break
        num=num.lstrip('0')
        k-=1
    return num

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:17:19 | 显示全部楼层

学习啦,字符串可以直接max,min。谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:23:22 | 显示全部楼层
本帖最后由 March2615 于 2020-4-23 21:14 编辑

大家都好快,越来越多人参与了,是好事啊
def daily383(num: str, k: int) -> str:
    # 解题思路
    # 决定数字大小的是从左到右的数字大小 -> 左边的数字越小越好
    # 遍历字符串,如果ch比left_ch小,则删去left_ch(较小的占较高位)
    # 否则,继续遍历,直到删除k次
    # 可能遍历完都没有删除k次 -> 但此时已经是升序排序(ch >= left_ch) -> 删去字符串尾的数字直到k次
    # 可以考虑用栈的思想
    if k == len(num):
        return '0'
    stack = []
    for i in range(len(num)):
        while stack and k and stack[-1] > num[i]:
            stack.pop()
            k -= 1
        stack.append(num[i])
    # if k == 0:
    #     ans = ''.join(stack)
    # else:
    #     ans = ''.join(stack[:-k])
    # if ans.lstrip('0'):
    #     return ans.lstrip('0')
    # else:
    #     return '0'
    ans = ''.join(stack[:-k]) if k else ''.join(stack)
    return ans.lstrip('0') or '0'
最后的判断也太难了,疯狂补漏的感觉

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:44:23 | 显示全部楼层
def f383(num:str,k:int)->str:
    if len(num)==k:
        return '0'
    i=0
    while k:
        if i+1==len(num):
            num=num[:-1]
            k-=1
            i=0
        if num[i]>=num[i+1]:
            num=num[0:i]+num[i+1:]
            k-=1
            i=0
        else:
            i+=1
    return str(int(num))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:51:31 | 显示全部楼层
def func383(num,k):
    n = len(num)
    i = 0
    if n == k:
        return 0
    while k>0:
        if num[i] >= num[i+1]:
            num = num[:i]+num[i+1:]
            k -= 1
            n -= 1
        else:
            i += 1
            if i == n-1:
                break
    if k!= 0:
        return int(num[:n-k])
    return int(num)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:52:04 | 显示全部楼层

虽然不想打击你,但很遗憾的告诉你……
你的答案没过……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 20:57:51 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-23 20:52
虽然不想打击你,但很遗憾的告诉你……
你的答案没过……

啊?为什么呀???不对的吗?是废话写太多了吗?
def timu383(s,k):
    return str(int(min(s[:k+1])+s[k+1:]))

这样呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 21:08:23 | 显示全部楼层
xiangjianshinan 发表于 2020-4-23 20:57
啊?为什么呀???不对的吗?是废话写太多了吗?

s='9',k=1 没过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 21:18:18 | 显示全部楼层

谢谢前辈的指点,已修改!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 21:18:51 | 显示全部楼层
有点麻烦
def f383(num:str,k:int):
    a = len(num) - k
    if a <= 0:
        return '0'
    while k > 0:
        if ('0' in num[:a]) and (k < num.find('0')) or ('0' not in num[:a]):
            x = max(num[:a])
            num = num.replace(x, '', 1)
        elif k == num.find('0'):
            num = num[num.find('0')+1:]
            break       
        else:
            b = num.find('0')
            k, a = k - b, a - b
            num = num[b+1:]
            x = max(num[:a])
            num = num.replace(x, '', 1)
        k -= 1
    if num == '':
        return '0'
    while num != '0' and num[0] == '0' :
        num = num[1:]
    return num

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 22:29:48 | 显示全部楼层
本帖最后由 liuzhengyuan 于 2020-4-24 09:30 编辑

现在做题的人好多(占楼)

这题要用动态规划???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 23:45:06 | 显示全部楼层
def f(num,k):
    num1 = num.replace('0','')
    if len(num1)<=k:
        return '0'
    else:
        d = num[:k]
        while d.find('0') != -1:
            d = d.replace('0','',1)
            d += num[k]
            k += 1
        d += num[k]
        s = min(set(d))
        n = 1
        while n<d.count(s):
            if k+1<len(num) and int(s)<=int(num[k+1]):
                n += 1
                k += 1
            else:
                break
        return str(int(s*n+num[k+1:]))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 22:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表