📌  相关文章
📜  查询到在给定范围内的二进制字符串的字符翻转(1)

📅  最后修改于: 2023-12-03 15:10:47.857000             🧑  作者: Mango

查询在给定范围内的二进制字符串的字符翻转

本篇介绍一个面试常见问题:给定一个二进制字符串和一个范围,将该范围内的字符串字符翻转。

问题描述

给定一个二进制字符串s和两个整数left和right,找出s从left到right的子串的字符翻转(翻转字符是0变成1,1变成0)后的结果。

解题思路

本题思路比较简单,只需要将指定范围内的字符进行翻转即可。具体的操作可以使用两种方式实现。

方式一:暴力

我们可以暴力枚举需要翻转的字符,逐个进行翻转。核心代码如下:

class Solution:
    def reverseBits(self, s: str, left: int, right: int) -> str:
        s = list(s)
        for i in range(left-1, right):
            if s[i] == "0":
                s[i] = "1"
            else:
                s[i] = "0"
        return "".join(s)
方式二:位运算

我们可以将指定范围内的字符进行异或操作,异或操作的规则是:0^1=1,1^0=1,0^0=0,1^1=0。因此,只需要将指定范围内的字符与一个全1的二进制数进行异或操作即可。核心代码如下:

class Solution:
    def reverseBits(self, s: str, left: int, right: int) -> str:
        num = int(s, 2)
        mask = ((1 << (right - left + 1)) - 1) << (left - 1)
        return bin(num ^ mask)[2:].zfill(len(s))
总结

本题比较简单,只需要按照要求对字符串进行翻转即可。本篇文章介绍了两个解题思路,一个是暴力枚举,一个是位运算。二者的时间复杂度都是O(n),空间复杂度都是O(1)。