鱼C论坛

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


欢迎大家一起答题!

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-4-19 20:36:10 | 显示全部楼层
本帖最后由 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[i].isdigit():
                n_index = i + 1
                break
        s = s[:n_index] + s[l_index + 1:r_index] * int(s[n_index: l_index]) + s[r_index + 1:]
    return s

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


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

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-19 20:44:09 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:46:49 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-19 20:47:38 | 显示全部楼层
盲猜这道题用栈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

模拟法
def f380(s):
    res = ''
    for i in range(len(s)):
        if s[i].isdigit():
            res += '+' + s[i] + '*'
        elif s[i] == '[':
            res += '('
        elif s[i] == ']':
            res += ')'
        else:
            res += '+1*%s' %repr(s[i])
    return eval(res)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-19 21:22:20 | 显示全部楼层
本帖最后由 塔利班 于 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

评分

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

查看全部评分

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

使用道具 举报

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

第二种方法也太秀了吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-19 22:12:14 | 显示全部楼层
本帖最后由 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+)\[([a-z]+)\]',s).groups()
            s=s.replace(a+'['+b+']',int(a)*b)
    except:
        return s

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-19 22:33:55 | 显示全部楼层
本帖最后由 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

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-20 01:26:27 | 显示全部楼层
本帖最后由 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)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-20 01:45:40 | 显示全部楼层
本帖最后由 sjtuszy 于 2020-4-20 16:14 编辑
def fun380(s):
    a = ''
    for i in range(len(s)):
        if s[i] == '[':
            a += '*('
        elif s[i] == ']':
            a += ')'
        elif s[i].isalpha():
            a += '+ 1 * %s' %repr(s[i])
        elif s[i].isdigit():
            if s[i-1].isdigit():
                a += '%s' %s[i]
            else:
                a += '+%s' %s[i]
    if a == '':
        return a
    return eval(a)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-20 02:33:32 From FishC Mobile | 显示全部楼层
虽然现在看不懂,但是以后肯定能看懂
想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-4-20 11:45:48 | 显示全部楼层
# 找到所有的方括号,依次进行解码
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[left_index+1:right_index], int(encoding_str[left_index-1]))
        encoding_str = encoding_str.replace(encoding_str[left_index-1:right_index+1], reused_str)
        left_index = encoding_str.find('[')
    return encoding_str
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-20 13:08:12 | 显示全部楼层
import re
def f380(s):
    while re.search('(\d+)\[([a-z]+)\]',s):
        x,y=re.search('(\d+)\[([a-z]+)\]',s).groups()
        s=s.replace(x+'['+y+']',int(x)*y)
    return s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

输入空字符串出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


第一种方法输入示例 2 中的数据结果有误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 18:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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