数学
2024年10月13日 00:08
解法:数学
考虑 x or (x + 1) 是一个怎样的数。可以发现,x + 1 的二进制表示和 x 相比,其实就是把 x 从最低位开始的连续 $1$ 都变成 $0$,然后把下一位变成 $1$,更高位都不变。
因此我们找出 nums[i] 从最低位开始的连续 $1$,把连续 $1$ 的最后一位变成 $0$,就是答案。复杂度 $\mathcal{O}(n\log X)$,其中 $X = 10^9$ 是取值范围。
参考代码(c++)
###cpp
class Solution {
public:
vector<int> minBitwiseArray(vector<int>& nums) {
vector<int> ans;
for (int x : nums) {
if (x == 2) ans.push_back(-1);
else {
// 求从最低位开始的连续 1
int p;
for (p = 0; x >> p & 1; p++);
// 把连续 1 的最后一位变成 0
ans.push_back(x ^ (1 << (p - 1)));
}
}
return ans;
}
};