📅  最后修改于: 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)。