Python:每日一题 380
本帖最后由 zltzlt 于 2020-4-19 20:37 编辑今天的题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:k,表示其中方括号内部的 encoded_string 正好重复 k 次。其中 k 为正整数。
说明:输入字符串中没有额外的空格。
注意:原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2 的输入。
示例 1:
输入:s = "32"
输出:"aaabcbc"
示例 2:
输入:s = "3]"
输出:"accaccacc"
示例 3:
输入:s = "23ef"
输出:"abcabccdcdcdef"
{:10_298:}欢迎大家一起答题!{:10_298:} 本帖最后由 March2615 于 2020-4-19 21:02 编辑
def daily380(s: str) -> str:
# 解题思路:
# 从左到右遍历找第一个],找到一个就和前一个[对应,并将其展开,返回新字符串
# 展开时需要注意数字的完整取值
while ']' in s:
n_index = 0
r_index = s.index(']')
l_index = s[:r_index].rfind('[')
for i in range(l_index-1, -1, -1):
if not s.isdigit():
n_index = i + 1
break
s = s[:n_index] + s * int(s) + s
return s
没有验证输入有误的情况
可以改进的地方
1. 验证输入(因为没说输入有误怎么办就没去考虑)
2. 数字提取,可以想想有没有其他方法
至于输入的合理性,在leetcode做过合法的括号,可以用栈 占楼 占楼 盲猜这道题用栈{:10_279:} 本帖最后由 kinkon 于 2020-4-20 11:16 编辑
模拟法
def f380(s):
res = ''
for i in range(len(s)):
if s.isdigit():
res += '+' + s + '*'
elif s == '[':
res += '('
elif s == ']':
res += ')'
else:
res += '+1*%s' %repr(s)
return eval(res) 本帖最后由 塔利班 于 2020-4-20 15:40 编辑
def f380(s):
res,l,count='',[],0
for e in s:
if e.isdigit():
count=10*count+int(e)
elif e=="[":
l.append((res,count))
res,count='',0
elif e!="]":
res+=e
elif e==']':
inner,innercount=l.pop()
res =inner +innercount*res
return res 塔利班 发表于 2020-4-19 21:22
第二种方法也太秀了吧…… 本帖最后由 fan1993423 于 2020-4-19 22:21 编辑
import re
def fun380(s):
try:
d=re.search('\d+',s).group()
while len(d):
a,b=re.search('(\d+)\[(+)\]',s).groups()
s=s.replace(a+'['+b+']',int(a)*b)
except:
return s 本帖最后由 TJBEST 于 2020-4-20 21:54 编辑
递归函数做的我想应该不超时
def fun380(s):
result = ''
state = 0#[的个数
repeat = ''#存储个数
inner = ''#存储内部内容
for each in s:
if each.isdigit():
if state == 0:
repeat += each
else:
inner += each
elif each == '[':
if state == 0:
state = 1
else:
inner += '['
state += 1
elif each == ']':
if state == 1:
state = 0
result += fun380(inner) * (int(repeat))
inner= ''
repeat = ''
else:
inner += ']'
state -= 1
else:
if state == 0:
result += each
else:
inner += each
return result 本帖最后由 Python3005 于 2020-4-20 01:33 编辑
import re
def fun(s):
result = re.search('(\D*)(\d*)\[(.*)\]', s)
w, n, m = result.groups()
while '[' in m:
m = fun(m)
return w + m*int(n) 本帖最后由 sjtuszy 于 2020-4-20 16:14 编辑
def fun380(s):
a = ''
for i in range(len(s)):
if s == '[':
a += '*('
elif s == ']':
a += ')'
elif s.isalpha():
a += '+ 1 * %s' %repr(s)
elif s.isdigit():
if s.isdigit():
a += '%s' %s
else:
a += '+%s' %s
if a == '':
return a
return eval(a) 虽然现在看不懂,但是以后肯定能看懂 本帖最后由 kkk999de 于 2020-4-20 10:11 编辑
def f380(s):
a,b = s.find('['),s.find(']')
s = s[:a-1]+s*int(s)+s
if s.find('[') != -1:
s = f380(s)
return s import re
def f(s):
def f1(s):
num = re.search(r'\d+',s)
string = re.search(r'+',s)
return int(num.group())*string.group()
while s.find('[') != -1:
code = re.search(r'\d+?\[+\]',s)
s = s.replace(code.group(),f1(code.group()))
return s # 找到所有的方括号,依次进行解码
def decode(encoding_str):
def repeat(string, num):
str1 = ""
for i in range(num):
str1 += string
return str1
left_index = encoding_str.find('[')
while left_index != -1:
right_index = encoding_str.find(']')
reused_str = repeat(encoding_str, int(encoding_str))
encoding_str = encoding_str.replace(encoding_str, reused_str)
left_index = encoding_str.find('[')
return encoding_str import re
def f380(s):
while re.search('(\d+)\[(+)\]',s):
x,y=re.search('(\d+)\[(+)\]',s).groups()
s=s.replace(x+'['+y+']',int(x)*y)
return s March2615 发表于 2020-4-19 20:36
没有验证输入有误的情况
可以改进的地方
1. 验证输入(因为没说输入有误怎么办就没去考虑)
750 ms kinkon 发表于 2020-4-19 20:52
模拟法
输入空字符串出错 塔利班 发表于 2020-4-19 21:22
第一种方法输入示例 2 中的数据结果有误
页:
[1]
2