python - 为什么我的程序只能在迭代字符串而不是列表时成功处理大量数据?
问题描述
我正在筛选 Hackerrank 上的问题——我偶然发现了一个令人困惑的障碍。以下是必须编程的游戏规则(“小黄人游戏”): 给两个玩家相同的字符串。两个玩家都必须使用字符串的字母来制作子字符串。斯图尔特必须造以辅音开头的单词。凯文必须以元音开头的单词。当两个玩家都做出所有可能的子串时,游戏结束。
例如,在字符串 BOB 中,OB 将被视为以元音开头的有效单词/子字符串,因此将给 Kevin 一个分数。
在尝试这个程序时,我创建了以下程序:
def minion_game(string):
v = ['A','E','I','O','U']
c = [
'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M' ,'N', 'P', 'Q', 'R', 'S',
'T', 'V', 'W', 'X', 'Y' 'Z'
]
L = list(string)
s = 0
k = 0
for i in range(len(L)):
if L[i] in v:
k += len(L) - i
elif L[i] in c:
s += len(L) - i
if s > k:
print(f"Stuart {s}")
elif k > s:
print(f"Kevin {k}")
elif k == s:
print("Draw")
该程序对大多数测试用例都有效,但是在输入字符串很大的测试用例中,程序会失败。例如,对于其中一个测试用例,预期的输出是 Stuart 406312,但由于某种原因,我创建的程序失败了。
然后我创建了以下程序,它适用于所有测试用例:
def minion_game(string):
vowels = 'AEIOU'
length = len(string)
k, s = 0, 0
for i in range(length):
if string[i] in vowels:
k += (length - i)
else:
s += (length - i)
if k > s:
print("Kevin", k)
elif k < s:
print("Stuart", s)
else:
print("Draw")
我的问题是——为什么我的第一个程序失败了一些测试用例,而我的第二个程序通过了所有测试用例?是因为我使用字符串而不是列表,为什么这会有所不同(除了效率)?
感谢您提前抽出时间。
解决方案
Python 中的字符串搜索使用fastsearch
它是Boyer-Moore-Horspool 算法和几个巧妙技巧的混合。查找成本O(1)
。
O(n)
如果是列表,您只需扫描它以查找项目,每次查找的成本都是如此。
推荐阅读
- python - 将熊猫列“一年中的某一天”转换为日期时间(%m-%d)?
- java - Kura 如何在bundle之间进行通信?
- twilio - 在 Asterisk PBX 上获取拨出呼叫的 sip 标头
- javascript - 移动菜单:点击父链接显示子菜单,但也直接进入父页面
- python - 最大不适用于 for 循环内的系列/列表
- ios - 将图像添加到 CAShapeLayer
- ruby-on-rails - Sidekiq 仅在开发机器上运行缓慢
- python - Python程序问题打印偶数
- javascript - 将事件传递给 React 中的嵌套函数并且没有获得外部事件值
- python - 删除开头和结尾相同的字符串的可变部分