鱼C论坛

 找回密码
 立即注册
查看: 3610|回复: 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 编辑

原地修改字符串
  1. def f383(s, k):
  2.     if len(s) <= k:
  3.         return '0'
  4.     l = 0
  5.     while k > 0 and l < len(s) - 1:        
  6.         if s[l] > s[l + 1]:
  7.             s = s.replace(s[l], '', 1)
  8.             k -= 1
  9.         else:            
  10.             l += 1
  11.         while l > 0 and s[l-1] > s[l]:
  12.             l -= 1
  13.     s = s[:-k] if k else s
  14.     return s.lstrip('0') or  '0'
复制代码

转列表修改
  1. def f383(s, k):
  2.     if len(s) <= k:
  3.         return '0'
  4.     s = list(s)
  5.     l = 0
  6.     while k > 0 and l < len(s) - 1:            
  7.         if s[l] > s[l + 1]:
  8.             s.pop(l)
  9.             k -= 1
  10.         else:            
  11.             l += 1
  12.         while l > 0 and s[l-1] > s[l]:
  13.             l -= 1
  14.     s = s[:-k] if k else s
  15.     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 编辑

原地修改字符串
  1. def f383(s, k):
  2.     if len(s) <= k:
  3.         return '0'
  4.     l = 0
  5.     while k > 0 and l < len(s) - 1:        
  6.         if s[l] > s[l + 1]:
  7.             s = s.replace(s[l], '', 1)
  8.             k -= 1
  9.         else:            
  10.             l += 1
  11.         while l > 0 and s[l-1] > s[l]:
  12.             l -= 1
  13.     s = s[:-k] if k else s
  14.     return s.lstrip('0') or  '0'
复制代码

转列表修改
  1. def f383(s, k):
  2.     if len(s) <= k:
  3.         return '0'
  4.     s = list(s)
  5.     l = 0
  6.     while k > 0 and l < len(s) - 1:            
  7.         if s[l] > s[l + 1]:
  8.             s.pop(l)
  9.             k -= 1
  10.         else:            
  11.             l += 1
  12.         while l > 0 and s[l-1] > s[l]:
  13.             l -= 1
  14.     s = s[:-k] if k else s
  15.     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 | 显示全部楼层
  1. str = input()
  2. k = int(input())

  3. for i in range(k):
  4.     max_num = max(str)
  5.     j = 0
  6.     while True:
  7.         if str[j] == max_num:
  8.             str = str[0:j] + str[j + 1:len(str)]
  9.             break
  10.         j += 1

  11. print(str)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-23 19:27:05 | 显示全部楼层
本帖最后由 xiangjianshinan 于 2020-4-26 14:49 编辑
  1. '''
  2. 给定一个以字符串表示的非负整数 num,移除 num 中的 k 位数字,使得剩下的数字最小。
  3. 以字符串形式返回 num 移除 k 位数字后的数字。
  4. 示例 1:
  5. 输入:num = "1432219", k = 3
  6. 输出:"1219"
  7. 解释:移除掉三个数字 4, 3, 和 2 。
  8. 示例 2:
  9. 输入:num = "10200", k = 1
  10. 输出:"200"
  11. 解释:移掉首位的 1,剩下的数字为 200,注意输出不能有任何前导零。
  12. 示例 3:
  13. 输入:num = "10", k = 2
  14. 输出:"0"
  15. 解释:从原数字移除所有的数字,剩余为空就是 0。
  16. 解析题意:
  17. 问题:怎样移除K位的数字,使得剩下的数字最小?
  18. 1、首先不能否认,我们需要移除高位的数才能令数值最小;
  19. 2、于是将s的前K+1位数字比较后,留下最小值即可。
  20. 过程如下:
  21. '''
  22. def timu383(s,k):
  23.     if len(s)<=k:
  24.         return '0'
  25.     else:
  26.         ls = list(s)                #输入:num = '112', k = 1  输出:'12'    预期结果:'11'  20200426 14:45
  27.         for i in range(k):
  28.             ls.remove(max(ls))
  29.         ta = int(''.join(ls))
  30.         tb = int(min(s[:k+1])+s[k+1:])
  31.         tc = ta if ta<= tb else tb
  32.         return str(tc)
  33. num = "1432219"
  34. k = 3
  35. print(timu383(num,k))
  36. num = "10200"
  37. k = 1
  38. print(timu383(num,k))
  39. num = "10"
  40. k = 2
  41. print(timu383(num,k))
  42. num = '112'
  43. k = 1
  44. print(timu383(num,k))
  45. 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 编辑
  1. def fun383(num,k):
  2.     M = len(num)
  3.     bits = M - k
  4.     if bits <= 0:
  5.         return '0'
  6.     result = ''
  7.     for bit in range(bits-1,0,-1):
  8.         minChar = min(num[:(-bit)])
  9.         p = num.index(minChar)
  10.         result += minChar
  11.         num = num[(p+1):]
  12.     minChar = min(num)
  13.     result += minChar
  14.     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 编辑
  1. def fun383(num,k):
  2.     d=num[:]
  3.     d=d.replace('0','')
  4.     if len(d)<=k: return '0'
  5.     if num==''.join(sorted(num)):return num[:-k]
  6.     while k>0:
  7.         for i in range(len(num)-1):
  8.             if num[i]>=num[i+1]:
  9.                 num=num.replace(num[i],'',1)
  10.                 break
  11.         num=num.lstrip('0')
  12.         k-=1
  13.     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 编辑

大家都好快,越来越多人参与了,是好事啊
  1. def daily383(num: str, k: int) -> str:
  2.     # 解题思路
  3.     # 决定数字大小的是从左到右的数字大小 -> 左边的数字越小越好
  4.     # 遍历字符串,如果ch比left_ch小,则删去left_ch(较小的占较高位)
  5.     # 否则,继续遍历,直到删除k次
  6.     # 可能遍历完都没有删除k次 -> 但此时已经是升序排序(ch >= left_ch) -> 删去字符串尾的数字直到k次
  7.     # 可以考虑用栈的思想
  8.     if k == len(num):
  9.         return '0'
  10.     stack = []
  11.     for i in range(len(num)):
  12.         while stack and k and stack[-1] > num[i]:
  13.             stack.pop()
  14.             k -= 1
  15.         stack.append(num[i])
  16.     # if k == 0:
  17.     #     ans = ''.join(stack)
  18.     # else:
  19.     #     ans = ''.join(stack[:-k])
  20.     # if ans.lstrip('0'):
  21.     #     return ans.lstrip('0')
  22.     # else:
  23.     #     return '0'
  24.     ans = ''.join(stack[:-k]) if k else ''.join(stack)
  25.     return ans.lstrip('0') or '0'
复制代码

最后的判断也太难了,疯狂补漏的感觉

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-23 20:44:23 | 显示全部楼层
  1. def f383(num:str,k:int)->str:
  2.     if len(num)==k:
  3.         return '0'
  4.     i=0
  5.     while k:
  6.         if i+1==len(num):
  7.             num=num[:-1]
  8.             k-=1
  9.             i=0
  10.         if num[i]>=num[i+1]:
  11.             num=num[0:i]+num[i+1:]
  12.             k-=1
  13.             i=0
  14.         else:
  15.             i+=1
  16.     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
虽然不想打击你,但很遗憾的告诉你……
你的答案没过……

啊?为什么呀???不对的吗?是废话写太多了吗?

  1. def timu383(s,k):
  2.     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 | 显示全部楼层
有点麻烦
  1. def f383(num:str,k:int):
  2.     a = len(num) - k
  3.     if a <= 0:
  4.         return '0'
  5.     while k > 0:
  6.         if ('0' in num[:a]) and (k < num.find('0')) or ('0' not in num[:a]):
  7.             x = max(num[:a])
  8.             num = num.replace(x, '', 1)
  9.         elif k == num.find('0'):
  10.             num = num[num.find('0')+1:]
  11.             break      
  12.         else:
  13.             b = num.find('0')
  14.             k, a = k - b, a - b
  15.             num = num[b+1:]
  16.             x = max(num[:a])
  17.             num = num.replace(x, '', 1)
  18.         k -= 1
  19.     if num == '':
  20.         return '0'
  21.     while num != '0' and num[0] == '0' :
  22.         num = num[1:]
  23.     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 | 显示全部楼层
  1. def f(num,k):
  2.     num1 = num.replace('0','')
  3.     if len(num1)<=k:
  4.         return '0'
  5.     else:
  6.         d = num[:k]
  7.         while d.find('0') != -1:
  8.             d = d.replace('0','',1)
  9.             d += num[k]
  10.             k += 1
  11.         d += num[k]
  12.         s = min(set(d))
  13.         n = 1
  14.         while n<d.count(s):
  15.             if k+1<len(num) and int(s)<=int(num[k+1]):
  16.                 n += 1
  17.                 k += 1
  18.             else:
  19.                 break
  20.         return str(int(s*n+num[k+1:]))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 18:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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