zltzlt 发表于 2020-4-23 18:46:56

Python:每日一题 383

本帖最后由 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。

{:10_298:}欢迎大家一起答题!{:10_298:}

永恒的蓝色梦想 发表于 2020-4-23 18:53:21

占楼

kinkon 发表于 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 > s:
            s = s.replace(s, '', 1)
            k -= 1
      else:            
            l += 1
      while l > 0 and s > s:
            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 > s:
            s.pop(l)
            k -= 1
      else:            
            l += 1
      while l > 0 and s > s:
            l -= 1
    s = s[:-k] if k else s
    return ''.join(s).lstrip('0') or '0'

_荟桐_ 发表于 2020-4-23 18:58:48

占楼

KevinHu 发表于 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 == max_num:
            str = str + str
            break
      j += 1

print(str)

xiangjianshinan 发表于 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)
      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修改
通过全部子串去取最大值后,与按逻辑去除前面的内容 比较后,输出小的结果的方式处理。

TJBEST 发表于 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))

xiangjianshinan 发表于 2020-4-23 20:06:12

终于有大师的感觉啦~~~

我飘啦。{:10_256:}

fan1993423 发表于 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>=num:
                num=num.replace(num,'',1)
                break
      num=num.lstrip('0')
      k-=1
    return num

xiangjianshinan 发表于 2020-4-23 20:17:19

fan1993423 发表于 2020-4-23 20:12


学习啦,字符串可以直接max,min。谢谢!

March2615 发表于 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:
            stack.pop()
            k -= 1
      stack.append(num)
    # 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'
最后的判断也太难了,疯狂补漏的感觉

ouyunfu 发表于 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>=num:
            num=num+num
            k-=1
            i=0
      else:
            i+=1
    return str(int(num))

whosyourdaddy 发表于 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 >= num:
            num = num[:i]+num
            k -= 1
            n -= 1
      else:
            i += 1
            if i == n-1:
                break
    if k!= 0:
      return int(num[:n-k])
    return int(num)

永恒的蓝色梦想 发表于 2020-4-23 20:52:04

xiangjianshinan 发表于 2020-4-23 19:27


虽然不想打击你,但很遗憾的告诉你……
你的答案没过……

xiangjianshinan 发表于 2020-4-23 20:57:51

永恒的蓝色梦想 发表于 2020-4-23 20:52
虽然不想打击你,但很遗憾的告诉你……
你的答案没过……

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

def timu383(s,k):
    return str(int(min(s[:k+1])+s))

这样呢?

永恒的蓝色梦想 发表于 2020-4-23 21:08:23

xiangjianshinan 发表于 2020-4-23 20:57
啊?为什么呀???不对的吗?是废话写太多了吗?




s='9',k=1 没过

xiangjianshinan 发表于 2020-4-23 21:18:18

永恒的蓝色梦想 发表于 2020-4-23 21:08
s='9',k=1 没过

谢谢前辈的指点,已修改!!!{:7_131:}

kkk999de 发表于 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
            break      
      else:
            b = num.find('0')
            k, a = k - b, a - b
            num = num
            x = max(num[:a])
            num = num.replace(x, '', 1)
      k -= 1
    if num == '':
      return '0'
    while num != '0' and num == '0' :
      num = num
    return num

liuzhengyuan 发表于 2020-4-23 22:29:48

本帖最后由 liuzhengyuan 于 2020-4-24 09:30 编辑

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

这题要用动态规划???

风魔孤行者 发表于 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 += 1
      d += num
      s = min(set(d))
      n = 1
      while n<d.count(s):
            if k+1<len(num) and int(s)<=int(num):
                n += 1
                k += 1
            else:
                break
      return str(int(s*n+num))
页: [1] 2 3 4
查看完整版本: Python:每日一题 383