鱼C论坛

 找回密码
 立即注册
查看: 4554|回复: 50

Python:每日一题 277

[复制链接]
发表于 2019-11-18 20:49:59 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2019-11-20 21:03 编辑

今天的题目:


给定一个字符串 s,返回 'xyz' 是否在字符串中出现过。

注意:如果 xyz 在字符串中出现过,但它前面一个字符是 .,则这个 "xyz" 不算在字符串中出现过。

示例 1:

输入:'abcxyz'
输出:True
示例 2:

输入:'abc.xyz'
输出:False
示例 3:

输入:'xyz.abc'
输出:True


欢迎大家一起答题!

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2019-11-18 20:55:44 | 显示全部楼层
给定一个字符串 s,如果 'xyz' 在 x 中出现过

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

使用道具 举报

 楼主| 发表于 2019-11-18 20:57:54 | 显示全部楼层

改了……

可能我题目表述得不太清楚,我的意思是,如果 xyz 在字符串中出现过,但它前面一个字符是 .,则这个 "xyz" 不算在字符串中出现过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-18 21:08:02 | 显示全部楼层
  1. def fun(s):
  2.     return True if 'xyz' in s and '.xyz' not in s else False
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-18 21:09:35 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-11-18 21:12 编辑
zltzlt 发表于 2019-11-18 20:57
改了……

可能我题目表述得不太清楚,我的意思是,如果 xyz 在字符串中出现过,但它前面一个字符是 . ...


s = '.xyzxyz'
算返回 True
没错吧
s = '.xyzxyz.xyz'
也是 True 吧?
s = 'xyz.xyz'
也是 True 对吧?
如果我没理解错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-18 21:16:25 | 显示全部楼层
阴阳神万物主 发表于 2019-11-18 21:09
s = '.xyzxyz'
算返回 True
没错吧

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

使用道具 举报

 楼主| 发表于 2019-11-18 21:17:44 | 显示全部楼层

解答错误

输入:'abc.xyzxyz'
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-18 21:23:39 | 显示全部楼层
一样的思路,不一样的表示,不晓得有没有区别
  1. solve = lambda s:True if s.count('xyz')-s.count('.xyz') else False
  2. solve_beta = lambda s:bool(s.count('xyz')-s.count('.xyz'))
  3. if __name__ == '__main__':
  4.     print('示例1 True 输出:',solve('abcxyz'))
  5.     print('示例2 False 输出:',solve('abc.xyz'))
  6.     print('示例3 True 输出:',solve('xyz.abc'))
复制代码

solve 和 solve_beta 在效率上有没有区别啊?
solve_beta 看起来简单点倒是

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1 恭喜通过

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:27:46 | 显示全部楼层
zltzlt 发表于 2019-11-18 20:57
改了……

可能我题目表述得不太清楚,我的意思是,如果 xyz 在字符串中出现过,但它前面一个字符是 . ...

这样的题目,表述上就是得稍微不清楚一些,不然这难度吗……哈哈

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-18 21:29:20 | 显示全部楼层
zltzlt 发表于 2019-11-18 21:17
解答错误

输入:'abc.xyzxyz'

改写一个。
  1. def fun(s):
  2.     for i in range(len(s) - 2):
  3.         if s[i: i + 3] == 'xyz' and s[i - 1: i + 3] != '.xyz':
  4.             return True
  5.     return False
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:29:58 | 显示全部楼层
本帖最后由 Stubborn 于 2019-11-18 21:41 编辑
  1. def fun(s:str):
  2.     if '.xyz' in s:return fun(s.replace('.xyz', ''))
  3.     return True if 'xyz' in s else False
复制代码

  1. def next_smaller(n:int) ->int:
  2.     """
  3.     :[url]https://www.codewars.com/kata/5659c6d896bc135c4c00021e/train/python[/url]
  4.     返回一个比n小的正整数,它有如下要求
  5.     你可以使它的位数进行交换,但是不能修改:
  6.         例如N = 21  你可以把1和2交换,返回一个比N小的整数12,你不能把2 - 1 返回11
  7.     当你找不到一个比N小的整数时,返回-1
  8.     当0不得不占首位时,情况同上,返回-1,即首位不能为0
  9.     """
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:34:59 | 显示全部楼层
  1. import re
  2. func = lambda x: bool(re.search('(^xyz)|[^.]xyz', x))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:36:17 | 显示全部楼层
  1. def func(str1):
  2.     if len(str1) < 3:
  3.         return False
  4.     count = 0
  5.     while count < len(str1) - 2:
  6.         if str1[count] != 'x':
  7.             count += 1
  8.         else:
  9.             if count == 0:
  10.                 if str1[count+1] == 'y' and str1[count+2] == 'z':
  11.                     return True
  12.                 else:
  13.                     count += 1
  14.             else:
  15.                 if str1[count+1] == 'y' and str1[count+2] == 'z' and str1[count-1] != '.':
  16.                     return True
  17.                 else:
  18.                     count += 1
  19.     return False
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:40:28 | 显示全部楼层
  1. import re

  2. def select(st1):
  3.     if re.search('xyz',st1):
  4.         if not re.search('.xyz',st1):
  5.             return True
  6.     return False
  7. if __name__=='__main__':
  8.     st1=input('请输入字符串:')
  9.     flags=select(st1)
  10.     print(flags)
复制代码

点评

输入 xyz.xyz 答案有误,应为 True  发表于 2019-11-20 21:05
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-18 21:42:22 | 显示全部楼层
本帖最后由 angtn 于 2019-11-18 22:08 编辑

翻了翻楼上突然发现'abc.xyzxyz',赶紧把代码改了下,希望这次是对的。
  1. def echo(ss):
  2.         while '.xyz' in ss:
  3.                 ss = ss.replace('.xyz','')
  4.         if 'xyz' in ss:
  5.                 return True
  6.         return False
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 21:44:36 | 显示全部楼层
写得不 Elegant,不管了,先提交
  1. def f277(s):
  2.     n = len(s)
  3.     if n < 3:
  4.         return False

  5.     if s[:3] == "xyz":
  6.         return True
  7.    
  8.     for i in range(n-3):
  9.         if s[i] != '.' and s[i+1:i+4] == "xyz":
  10.             return True
  11.     return False
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 22:37:01 | 显示全部楼层
本帖最后由 peicd 于 2019-11-19 13:12 编辑
  1. def abc(s):
  2.     return 'xyz' in s.replace('.xyz','@')
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 22:39:55 | 显示全部楼层
  1. def solve(s):
  2.     while '.xyz' in s:
  3.         s = s.replace('.xyz', ' ')
  4.     return 'xyz' in s
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 22:41:35 | 显示全部楼层
  1. def f(x):
  2.     if 'xyz' in x:
  3.         n=x.index('xyz')
  4.         if '.' not in x[:n]:
  5.             return True
  6.     return False
  7. x0=f('abcxyz')
  8. x1=f('abc.xyz')
  9. x2=f('xyz.abc')
  10. print(x0,x1,x2)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-11-18 22:48:03 | 显示全部楼层
我先理解一下题意思。题目是:
给定一个字符串 s,如果 'xyz' 在 s 中出现过,并且 'xyz' 前面没有 '.' 符号,则返回 True,否则返回 False
我直接奔着True去,大前提条件是xyz必须出现,对吧
然后是子字符串xyz前面没有"."符号,这里我就奇怪了,究竟是全部的xyz字符串满足,还是只要有一个满足就可,直到我看到
输入:'abc.xyzxyz'
输出:False
预期结果:True
懂了,最后的结果就是:一个字符串,只要包含有一个xyz前面不是"."即可,那么用正则直接search即可。
或者按照分析思路来,先查有没有xyz,再判断".xyz"和“xyz” 的计数相不相等就可以判断了
我贴一下代码
  1. import re


  2. while 1:
  3.     s = input("测试输入字符串,输入q停止测试:")
  4.     if s == "q":
  5.         break

  6.     def f1(s):
  7.         if s[:3] == "xyz":
  8.             return True
  9.         pattern = re.compile(r"[^.]xyz")
  10.         try:
  11.             if pattern.search(s).group(0):
  12.                 return True
  13.         except AttributeError:
  14.             return False

  15.     print(f1(s))

  16.     def f2(s):
  17.         if s[:3] == "xyz":
  18.             return True
  19.         if "xyz" not in s:
  20.             return False
  21.         else:
  22.             if s.count("xyz") == s.count(".xyz"):
  23.                 return False
  24.             else:
  25.                 return True

  26.     print(f2(s))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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