原题链接:
https://leetcode.cn/problems/longest-nice-subarray/
这题关键在于想到:
1.或运算(|) 可以保存一段连续的数中 互相与运算(&)的结果
比如 如果要判断 001 与 101 110相与是否为0
其实就是看 001 的1的位置 与 101 110中1的位置是否重合
就等价于看001中1的位置是否与 111中1的位置是否重合
2.异或运算可以还原或运算的结果
或运算的过程其实就是保留1的过程 将之前同样的数与当前与结果按顺序异或相当于不断将保留的1 进行还原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def longestNiceSubarray(self, nums: List[int]) -> int:
n = len(nums)
if n == 1:
return 1
l, r = 0, 1
w = nums[l]
ans = 1
while r < n:
while w & nums[r] != 0 and l < r:
# 这里用异或
# 因为之前是 与运算 0 1 为0 只有 1 1 才会保留 相当于将原先w中的1 消去
# 使用异或运算 相当于按顺序将原先w 中的1 还原
w ^= nums[l]
l = l + 1
w = w | nums[r]
ans = max(ans, r - l + 1)
r = r + 1
return ans