我正在解决this HackerRank challenge:
Alice有一个二进制字符串。她认为,且仅当二进制字符串不包含子字符串“ 010”时,它才是美丽的字符串。
第一步,爱丽丝可以将
0
更改为1
,反之亦然。计算并打印使Alice看到字符串很漂亮所需的最少步骤数。
因此基本上可以计算传递给函数的字符串'b'中出现'010'的次数。
一旦i
语句为真,我想将if
加2,以免在我的'010'
中不包含重叠的count
字符串。
我确实意识到我可以使用count方法,但是我想知道为什么我的代码无法按我想要的方式工作。
def beautifulBinaryString(b):
count = 0
for i in range(len(b)-2):
if b[i:i+3]=='010':
count+=1
i+=2
return count
输入:0101010
预期输出:2
我得到的输出是这样的代码:3
答案 0 :(得分:3)
您正在计数重叠序列。对于您的输入0101010
,您发现010
的次数为3,但中间的010
与外部的两个010
序列重叠:
0101010
--- ---
---
您不能在i
循环中递增for
,因为for
循环构造位于顶部的 sets i
。在循环体内给i
提供一个不同的值不会改变这一点。
不要使用for
循环;您可以使用while
循环:
def beautifulBinaryString(b):
count = 0
i = 0
while i < len(b) - 2:
if b[i:i+3]=='010':
count += 1
i += 2
i += 1
return count
一个简单的解决方案是只使用b.count("010")
,如您所说。
答案 1 :(得分:0)
如果要使用for循环执行此操作,则可以添加一个增量变量,以跟踪必须跳过当前i值的位置数量。
def beautifulBinaryString(b):
count = 0
delta = 0
for i in range(len(b)-2):
try:
if b[i+delta:i+delta+3]=='010':
count+=1
delta=delta+2
except IndexError:
break
return count
答案 2 :(得分:-1)
您无需计算发生次数;一旦发现一个出现,字符串就是“丑陋”。如果您找不到一个,那就太漂亮了。
def is_beautiful(b):
for i in range(len(b) - 2):
if b[i:i+3] == '010':
return False
return True
您还可以通过简单地跟踪是否已开始查看010
来避免切片:
seen_0 = False
seen_01 = False
for c in b:
if seen_01 and c == '0':
return False
elif seen_1 and c == '1':
seen_01 = True
elif c == '0':
seen_0 = True
else:
# c == 1, but it doesn't follow a 0
seen_0 = False
seen_01 = False
return True