鱼C论坛

 找回密码
 立即注册
查看: 3377|回复: 45

[已解决]Python:每日一题 330

[复制链接]
发表于 2020-2-12 17:46:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-2-12 18:28 编辑

今天的题目:


给定由字母 a 和 b 组成的字符串。在一次操作中,可以将一个字母替换成另一个字母(a 替换成 b 或 b 替换成 a)。

返回得到不包含连续三个相同字母的字符串所需的最少操作次数

示例 1:

输入:"baaaaa"
输出:1
解释:将字符串变成 "baabaa" 。
示例 2:

输入:"baaabbaabbba"
输出:2
解释:将字符串变成 "bbaabbaabbaa" 。


欢迎大家一起答题!
最佳答案
2020-2-13 01:22:46
本帖最后由 kinkon 于 2020-2-13 11:14 编辑
  1. def fun330(s):
  2.     a, c, t = 'a', 0, 0
  3.     for i in s:
  4.         if i == a:
  5.             t += 1
  6.             if t == 3:
  7.                 c += 1
  8.                 t = 0
  9.         else:
  10.             a, t = i, 1
  11.     return c
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-2-12 17:51:58 | 显示全部楼层
本帖最后由 一个账号 于 2020-2-12 18:08 编辑

示例 2 应该输出 2,前面的 a 换成 b ,后面的 b 换成 a 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:00:29 | 显示全部楼层
建议楼主列举个稍微大点数据的例子,以方便自己做完以后检查正确与否,再提交答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:02:41 | 显示全部楼层
另外对于这种abba,没有3个连续数的情况,直接返回0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:05:34 | 显示全部楼层
示例2不是应该输出2嘛,前面的 a 换成 b ,后面的 b 换成 a 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:14:29 | 显示全部楼层
  1. def solve_330(s: str):
  2.     s = list(s)
  3.     c_a, c_b, res, i = 0, 0, 0, 0
  4.     while i<len(s):
  5.         if s[i] == 'a':
  6.             c_a += 1
  7.             res += c_b//3
  8.             c_b = 0
  9.         elif s[i] == 'b':
  10.             c_b += 1
  11.             res += c_a//3
  12.             c_a = 0
  13.         i += 1
  14.     res+=(c_b//3 + c_a//3)
  15.     return res
复制代码

前排前排

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-12 18:28:35 | 显示全部楼层
fan1993423 发表于 2020-2-12 18:02
另外对于这种abba,没有3个连续数的情况,直接返回0吗?

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

使用道具 举报

 楼主| 发表于 2020-2-12 18:28:45 | 显示全部楼层
yexing 发表于 2020-2-12 18:05
示例2不是应该输出2嘛,前面的 a 换成 b ,后面的 b 换成 a 。

搞错了,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 18:28:51 | 显示全部楼层
一个账号 发表于 2020-2-12 17:51
示例 2 应该输出 2,前面的 a 换成 b ,后面的 b 换成 a 。

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

使用道具 举报

发表于 2020-2-12 18:33:43 | 显示全部楼层
本帖最后由 fan1993423 于 2020-2-12 18:42 编辑
  1. from itertools import groupby
  2. from bisect import bisect_left
  3. def fun330(s):
  4.     if not len(s):return 0
  5.     t,result=[],0
  6.     for k,v in groupby(s):t.append(len(list(v)))
  7.     t_sort=sorted(t)
  8.     if t_sort[-1]<3:return 0
  9.     index=bisect_left(t_sort,3)
  10.     for i in t_sort[index:]:result+=i//3
  11.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-12 18:37:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 18:37:44 | 显示全部楼层
fan1993423 发表于 2020-2-12 18:33
简单写了个不知道效率

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

使用道具 举报

发表于 2020-2-12 18:39:19 | 显示全部楼层
zltzlt 发表于 2020-2-12 18:37
输入空字符串 "" 出错

还要考虑空字符串啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 18:40:02 | 显示全部楼层
空字符串返回0吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-12 18:41:23 | 显示全部楼层
fan1993423 发表于 2020-2-12 18:40
空字符串返回0吗?

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

使用道具 举报

发表于 2020-2-12 18:42:12 | 显示全部楼层
改了

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-2-12 19:02:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 19:07:43 | 显示全部楼层

嗯,可能用groupby慢了点速度,不过groupby更科学,如果这道题不是2个字母,而是26个字母都可以的话。就要多使用一次循环,速度会更慢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 19:11:36 | 显示全部楼层

效率略低啊。。。暂时还没想出这个程序的改进方法,这个程序的时间复杂度,也就 n 啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 19:18:01 | 显示全部楼层
  1. def fun330(s):
  2.     if(len(s) == 0):
  3.         return 0
  4.     result = 0
  5.     count = 1
  6.     for index in range(1,len(s)):
  7.         if(s[index] == s[index-1]):
  8.             count += 1
  9.             if(count >= 3):
  10.                 if(s[index] == 'a'):
  11.                     s[index] == 'b'
  12.                 else:
  13.                     s[index] == 'a'
  14.                 count = 1
  15.                 result += 1
  16.         else:
  17.             count = 1
  18.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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