直接模拟
根据题意依次异或。
class Solution {
public int xorOperation(int n, int start) {
int ans = 0;
for (int i = 0; i < n; ++i){
ans ^= start + i * 2;
}
return ans;
}
}
使用位运算性质
参考:https://leetcode-cn.com/problems/xor-operation-in-an-array/solution/o1-wei-yun-suan-by-bruceyuj/
class Solution {
public int xorOperation(int n, int start) {
// 最后一位
// 如果start是偶数,则最后一位是0
// 如果start是奇数,则最后一位是n个1异或
int lastBit;
if (start % 2 == 0) {
lastBit = 0;
} else {
lastBit = n % 2;
}
// 右移后新序列的结果
int newPart;
// 如果start / 2 是偶数,
// 如果n是偶数,则相当于n / 2 个1异或,
// 如果n是奇数,则相当于n / 2 个1异或,然后再异或上start / 2 + n - 1
if ((start / 2) % 2 == 0) {
newPart = (n / 2) % 2;
if (n % 2 == 1) {
newPart ^= start / 2 + n - 1;
}
} else {
// 如果start / 2 是奇数,则取出第一项start / 2,剩下的相当于start / 2 是偶数的情况
newPart = ((n - 1) / 2) % 2;
if ((n - 1) % 2 == 1) {
newPart ^= start / 2 + n - 1;
}
newPart ^= start / 2;
}
return (newPart << 1) + lastBit;
}
}