如果满足“ if”条件,是否可以增加迭代器

时间:2019-01-29 18:35:21

标签: python python-3.x

我正在解决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

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