阿里2020.4.1实习笔试题——翻转01字符串

问题描述

给一串二进制字符串如00011001,希望把他改为全为0,如果更改某个字符,那么他两边的字符也要更改,例如把第二位的0换成1,那么就变成了11111001. 求最少翻转次数。如果无法全0,输出NO。

问题解析

因为每翻转当前字符,其相邻字符也会翻转,所以每当遇见为1的字符时,将它下一个的字符进行翻转。因为这样做可以保证之前的字符全部为0,即本次翻转不会影响之前的结果。如此循环迭代之后,判断最后一个是否为0即可。

代码解析

def flip(s, i):
    def __flip(s, i):
        s = s[:i] + str(1 - int(s[i])) + s[i + 1:]
        return s
    
    s = __flip(s, i - 1)
    s = __flip(s, i)
    if i < len(s) - 1:
        s = __flip(s, i + 1)
    return s


def judge(s: str):
    cnt = 0
    n = len(s)
    for i in range(n - 1):
        if s[i] == '1':
            s = flip(s, i + 1)
            cnt += 1
        
    return cnt if s[n - 1] == '0' else -1

s = input()
res = judge(s)
if res == -1:
    print('No')
else:
    print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值