鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: zltzlt

[技术交流] Python:每日一题 232(答题有奖)

 关闭 [复制链接]
发表于 2019-8-30 21:35:04 | 显示全部楼层
采用消消乐的解法,成对后剔除,但是没想好怎么实现跳出循环,因为三种成对元素有顺序的,不好控制次数。写的3次对于复杂嵌套字符应该不够,给一个大数效率又低了。
def answer(strs):
    strs = strs.replace(' ', '')
    count = 0
    while count < 3:
        strs = strs.replace('{}', '')
        strs = strs.replace('[]', '')
        strs = strs.replace('()', '')
        count += 1
    return bool(strs == '')

print(answer("{  [  ]  }"))
print(answer("()[]{}"))

点评

我很赞同!: 3.0
我很赞同!: 3
再想想哦  发表于 2019-8-31 15:37
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-30 22:24:57 From FishC Mobile | 显示全部楼层
panheng 发表于 2019-8-30 21:31
题目没太懂 那种嵌套必须是以中心对称吗? "(()[]{})"  返回True吗?

只要是 () [] {} 成对的(包括嵌套,但不可以这样:([]{)})都返回 True 哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 00:02:38 | 显示全部楼层
def echo(ss):
        while '{}' in ss or '()' in ss or '[]' in ss:
            ss = ss.replace('{}', '')
            ss = ss.replace('[]', '')
            ss = ss.replace('()', '')
        return ss == ''


str1 = "()[]{}"
sss = echo(str1)
print(sss)

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1 解法不错,但我没想到这种方法……

查看全部评分

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

使用道具 举报

发表于 2019-8-31 07:09:31 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-8-30 18:46
如果没有例二的话,直接eval()就可以

这样string[k:]是不是被舍弃了,如果后面出现False,是不是就漏判了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 07:17:40 | 显示全部楼层
我想问下这样算false还是True
根据条件第2条:
字符串'(()[]{([])})'红色这里算是false吧。可以理解为如果出现左括号,那么在出现对应右括号前不能出现相同的左括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 07:18:36 From FishC Mobile | 显示全部楼层
lucky邪神 发表于 2019-8-31 07:17
我想问下这样算false还是True
根据条件第2条:
字符串'(()[]{([])})'红色这里算是false吧。可以理解为如 ...

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

使用道具 举报

发表于 2019-8-31 07:52:54 | 显示全部楼层

从早上上班到现在都快下班了,就中间出去租了下车,如果是这样那么下面的应该可以试试
def justic(str1):
    while re.findall('\(\)',str1)!=[] or re.findall('\[\]',str1)!=[] or re.findall('\{\}',str1)!=[]:
        str1=str1.replace('()','')
        str1=str1.replace('[]','')
        str1=str1.replace('{}','')
        
    if str1=='':
        return True
    else:
        return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 10:13:59 | 显示全部楼层
def isbracketmatch(sz):
    list=[]
    leftbracket=('(','[','{')
    rightbracket=(')',']','}')
    for ch in sz:
        if (ch in leftbracket):
            list.append(ch)
        else:
            ch2=leftbracket[rightbracket.index(ch)]
            if (len(list)==0 or list[-1]!=ch2):
                return False
            list.pop()
    return (len(list)==0)

sz=input()
if isbracketmatch(sz):
    print("括号匹配")
else:
    print("括号不匹配")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-31 12:35:28 | 显示全部楼层
塔利班 发表于 2019-8-30 20:56
忘了原来时间复杂度小的怎么写了,应该还是指针移动来去的

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

使用道具 举报

发表于 2019-8-31 14:03:59 | 显示全部楼层
本帖最后由 tomywow 于 2019-8-31 15:40 编辑

def y(x):
    #将右边字符转换为左边字符后返回
    a=[]
    for i in x:
        if i=="]":
            a.append("[")
        elif i==")":
            a.append("(")
        elif i=="}":
            a.append("{")
        else:
            a.append(i)
    return a

s=input("请输入字符串:")
t=True
l=[] #存储左边的字符({[和空格
i=0  
print("字符串: "+s)
while i<len(s):
    #如果为左边的字符
    if s[i]=="(" or s[i]=="{" or s[i]=="[" or s[i]==" ":
        l.append(s[i])
        i=i+1
    else:
        print("左边字符: "+str(l))
        a=len(l)
        print("右边字符: "+str(s[i:i+a]))
        if len(s[i:])<a:
            print("  发现:右边"+str(s[i:])+"比左边"+str(l)+"短,false")
            t=False
            break
        c=y(s[i:i+a])
        c.reverse()
        print("右边字符转换后的值:"+str(c)+"\n")
        if c==l:
            b=[]
            i=i+a
            l=b
        else:
            t=False
            break
if t==False:
    print("结果:False")
else:
    print("结果:True")

看代码,错误,没有解决嵌套问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 14:09:01 | 显示全部楼层
正则简单替换了一下。
import re

lst_symbol=["()","()[]{}","(]", "([)]"]

for ele in lst_symbol:
    print( False if  re.sub('\(\)|\[]|\{\}','',ele) else  True )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 14:16:11 | 显示全部楼层
zltzlt 发表于 2019-8-30 20:16
except:
                pass

难道要任由其报错?try不是if,没有except啥都干不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 14:16:53 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-8-31 14:16
难道要任由其报错?try不是if,没有except啥都干不了

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

使用道具 举报

发表于 2019-8-31 14:19:11 | 显示全部楼层

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

使用道具 举报

发表于 2019-8-31 14:19:37 | 显示全部楼层
本帖最后由 tomywow 于 2019-8-31 15:40 编辑

def y(x):
    #将右边字符转换为左边字符后返回
    a=[]
    for i in x:
        if i=="]":
            a.append("[")
        elif i==")":
            a.append("(")
        elif i=="}":
            a.append("{")
        else:
            a.append(i)
    return a

while True:
    s=input("请输入字符串(quit退出):")
    if s.lower()=="quit":
        break
    t=True
    l=[] #存储左边的字符({[和空格
    i=0  
    while i<len(s):
        #如果为左边的字符
        if s[i]=="(" or s[i]=="{" or s[i]=="[" or s[i]==" ":
            l.append(s[i])
            i=i+1
        else:
            a=len(l)
            if len(s[i:])<a: #如果右边字符长度比左边短
                t=False
                break
            c=y(s[i:i+a])    #转换右边字符
            c.reverse()      #反转右边字符
            if c==l:         #如果右边字符与左边相等
                i=i+a
                l=[]         #重置列表L
            else:
                t=False
                break
    if t==False:
        print("结果:False")
    else:
        print("结果:True")

补充:改思路错,没有解决嵌套问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 14:20:02 | 显示全部楼层

评分

参与人数 1荣誉 +1 收起 理由
永恒的蓝色梦想 + 1 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

发表于 2019-8-31 14:30:38 | 显示全部楼层
本帖最后由 tomywow 于 2019-8-31 15:39 编辑

思路:
1,遍历整个字符串
2,左边是这四个字符,{([和空格,将它们存储在一个列表L里面
3,如果遍历到右边字符,即})],那么:
    1,如果右边剩下的字符长度比左边的短,肯定不匹配,FALSE
    2,将右边的字符转换为对应的左边字符,再反转
    3,比较左边字符和右边字符是否匹配
           1,如果一样,就把循环计数器加上列表L的长度,再把列表L清空
           2,不匹配:FALSE
    4,如果能遍历完,说明OK

补充:改思路错的,它无法判断嵌套问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-31 15:36:02 | 显示全部楼层
tomywow 发表于 2019-8-31 14:30
思路:
1,遍历整个字符串
2,左边是这四个字符,{([和空格,将它们存储在一个列表L里面

不错,但是当参数 x 为 ()()(){}{}{}[][][[][][]] 时会进入死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 15:36:50 | 显示全部楼层
本帖最后由 tomywow 于 2019-8-31 15:50 编辑

#-*-coding:utf8;-*-
#qpy:3
#qpy:console

#解题思路:始终有一对[](){}出现,所以可以不断循环查找#整个字符串,当找到时,使用replace(,"")替换即可,如果
#最后字符串的为空则表示true
while True:
    s=input("输入符号(quit退出):")
    if s.lower()=="quit":
        break
    t=True
    while s!="":
        if "[]" in s:
            s=s.replace("[]","")
        elif "()" in s:
            s=s.replace("()","")
        elif "{}" in s:
            s=s.replace("{}","")
        elif "  " in s:
            s=s.replace("  ","")
        else:
            t=False
            break
    if t==True:
        print("True\n")
    else:
        print("Falae\n")

这个应该是对的,感觉又解决问题了

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2019-8-31 15:41
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-31 15:59:13 | 显示全部楼层
zltzlt 发表于 2019-8-31 15:36
不错,但是当参数 x 为 ()()(){}{}{}[][][[][][]] 时会进入死循环

大佬,为何会陷入死循环呢,我没发现问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 14:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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