鱼C论坛

 找回密码
 立即注册
查看: 3162|回复: 35

Python:每日一题 380

[复制链接]
发表于 2020-4-19 20:13:49 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-4-19 20:37 编辑

今天的题目:


给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为:k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。其中 k 为正整数。

说明:输入字符串中没有额外的空格。

注意:原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"


欢迎大家一起答题!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:36:10 | 显示全部楼层
本帖最后由 March2615 于 2020-4-19 21:02 编辑
  1. def daily380(s: str) -> str:
  2.     # 解题思路:
  3.     # 从左到右遍历找第一个],找到一个就和前一个[对应,并将其展开,返回新字符串
  4.     # 展开时需要注意数字的完整取值
  5.     while ']' in s:
  6.         n_index = 0
  7.         r_index = s.index(']')
  8.         l_index = s[:r_index].rfind('[')
  9.         for i in range(l_index-1, -1, -1):
  10.             if not s[i].isdigit():
  11.                 n_index = i + 1
  12.                 break
  13.         s = s[:n_index] + s[l_index + 1:r_index] * int(s[n_index: l_index]) + s[r_index + 1:]
  14.     return s
复制代码


没有验证输入有误的情况
可以改进的地方
1. 验证输入(因为没说输入有误怎么办就没去考虑)
2. 数字提取,可以想想有没有其他方法


至于输入的合理性,在leetcode做过合法的括号,可以用栈

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-19 20:44:09 | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:46:49 | 显示全部楼层
占楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:47:38 | 显示全部楼层
盲猜这道题用栈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 20:52:22 From FishC Mobile | 显示全部楼层
本帖最后由 kinkon 于 2020-4-20 11:16 编辑

模拟法
  1. def f380(s):
  2.     res = ''
  3.     for i in range(len(s)):
  4.         if s[i].isdigit():
  5.             res += '+' + s[i] + '*'
  6.         elif s[i] == '[':
  7.             res += '('
  8.         elif s[i] == ']':
  9.             res += ')'
  10.         else:
  11.             res += '+1*%s' %repr(s[i])
  12.     return eval(res)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 21:22:20 | 显示全部楼层
本帖最后由 塔利班 于 2020-4-20 15:40 编辑
  1. def f380(s):
  2.     res,l,count='',[],0
  3.     for e in s:
  4.         if e.isdigit():
  5.             count=10*count+int(e)
  6.         elif e=="[":
  7.             l.append((res,count))
  8.             res,count='',0
  9.         elif e!="]":
  10.             res+=e
  11.         elif e==']':
  12.             inner,innercount=l.pop()
  13.             res =inner +innercount*res
  14.     return res
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 22:07:33 | 显示全部楼层

第二种方法也太秀了吧……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 22:12:14 | 显示全部楼层
本帖最后由 fan1993423 于 2020-4-19 22:21 编辑
  1. import re
  2. def fun380(s):
  3.     try:
  4.         d=re.search('\d+',s).group()
  5.         while len(d):
  6.             a,b=re.search('(\d+)\[([a-z]+)\]',s).groups()
  7.             s=s.replace(a+'['+b+']',int(a)*b)
  8.     except:
  9.         return s
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 22:33:55 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-20 21:54 编辑

递归函数做的我想应该不超时
  1. def fun380(s):
  2.     result = ''
  3.     state = 0#[的个数
  4.     repeat = ''#存储个数
  5.     inner = ''#存储内部内容
  6.     for each in s:
  7.         if each.isdigit():
  8.             if state == 0:
  9.                 repeat += each
  10.             else:
  11.                 inner += each
  12.         elif each == '[':
  13.             if state == 0:
  14.                 state = 1
  15.             else:
  16.                 inner += '['
  17.                 state += 1
  18.         elif each == ']':
  19.             if state == 1:
  20.                 state = 0
  21.                 result += fun380(inner) * (int(repeat))
  22.                 inner  = ''
  23.                 repeat = ''
  24.             else:
  25.                 inner += ']'
  26.                 state -= 1
  27.         else:
  28.             if state == 0:
  29.                 result += each
  30.             else:
  31.                 inner += each
  32.     return result
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 01:26:27 | 显示全部楼层
本帖最后由 Python3005 于 2020-4-20 01:33 编辑
  1. import re

  2. def fun(s):
  3.         result = re.search('(\D*)(\d*)\[(.*)\]', s)
  4.         w, n, m = result.groups()
  5.         while '[' in m:
  6.                 m = fun(m)
  7.         return w + m*int(n)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 01:45:40 | 显示全部楼层
本帖最后由 sjtuszy 于 2020-4-20 16:14 编辑
  1. def fun380(s):
  2.     a = ''
  3.     for i in range(len(s)):
  4.         if s[i] == '[':
  5.             a += '*('
  6.         elif s[i] == ']':
  7.             a += ')'
  8.         elif s[i].isalpha():
  9.             a += '+ 1 * %s' %repr(s[i])
  10.         elif s[i].isdigit():
  11.             if s[i-1].isdigit():
  12.                 a += '%s' %s[i]
  13.             else:
  14.                 a += '+%s' %s[i]
  15.     if a == '':
  16.         return a
  17.     return eval(a)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 02:33:32 From FishC Mobile | 显示全部楼层
虽然现在看不懂,但是以后肯定能看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 09:55:19 | 显示全部楼层
本帖最后由 kkk999de 于 2020-4-20 10:11 编辑

def f380(s):
    a,b = s.find('['),s.find(']')
    s = s[:a-1]+s[a+1:b]*int(s[a-1])+s[b+1:]
    if s.find('[') != -1:
        s = f380(s)
    return s

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 11:04:48 | 显示全部楼层
  1. import re
  2. def f(s):
  3.     def f1(s):
  4.         num = re.search(r'\d+',s)
  5.         string = re.search(r'[a-z,A-Z]+',s)
  6.         return int(num.group())*string.group()
  7.     while s.find('[') != -1:
  8.               code = re.search(r'\d+?\[[a-z,A-Z]+\]',s)
  9.               s = s.replace(code.group(),f1(code.group()))
  10.     return s
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 11:45:48 | 显示全部楼层
# 找到所有的方括号,依次进行解码
  1. def decode(encoding_str):
  2.     def repeat(string, num):
  3.         str1 = ""
  4.         for i in range(num):
  5.             str1 += string
  6.         return str1
  7.     left_index = encoding_str.find('[')
  8.     while left_index != -1:
  9.         right_index = encoding_str.find(']')
  10.         reused_str = repeat(encoding_str[left_index+1:right_index], int(encoding_str[left_index-1]))
  11.         encoding_str = encoding_str.replace(encoding_str[left_index-1:right_index+1], reused_str)
  12.         left_index = encoding_str.find('[')
  13.     return encoding_str
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 13:08:12 | 显示全部楼层
  1. import re
  2. def f380(s):
  3.     while re.search('(\d+)\[([a-z]+)\]',s):
  4.         x,y=re.search('(\d+)\[([a-z]+)\]',s).groups()
  5.         s=s.replace(x+'['+y+']',int(x)*y)
  6.     return s
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-20 13:32:26 | 显示全部楼层
March2615 发表于 2020-4-19 20:36
没有验证输入有误的情况
可以改进的地方
1. 验证输入(因为没说输入有误怎么办就没去考虑)

750 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-20 13:33:24 | 显示全部楼层

输入空字符串出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-20 13:34:17 | 显示全部楼层


第一种方法输入示例 2 中的数据结果有误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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