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:} 占楼 本帖最后由 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' 占楼 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-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-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)) 终于有大师的感觉啦~~~
我飘啦。{:10_256:} 本帖最后由 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 fan1993423 发表于 2020-4-23 20:12
学习啦,字符串可以直接max,min。谢谢! 本帖最后由 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'
最后的判断也太难了,疯狂补漏的感觉 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)) 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) xiangjianshinan 发表于 2020-4-23 19:27
虽然不想打击你,但很遗憾的告诉你……
你的答案没过…… 永恒的蓝色梦想 发表于 2020-4-23 20:52
虽然不想打击你,但很遗憾的告诉你……
你的答案没过……
啊?为什么呀???不对的吗?是废话写太多了吗?
def timu383(s,k):
return str(int(min(s[:k+1])+s))
这样呢? xiangjianshinan 发表于 2020-4-23 20:57
啊?为什么呀???不对的吗?是废话写太多了吗?
s='9',k=1 没过 永恒的蓝色梦想 发表于 2020-4-23 21:08
s='9',k=1 没过
谢谢前辈的指点,已修改!!!{:7_131:} 有点麻烦
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-24 09:30 编辑
现在做题的人好多(占楼)
这题要用动态规划??? 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))