LeetCode周赛 | 1486一个位运算easy题目的数学解

2020-06-22  本文已影响0人  zilla

传送门 1486. 数组异或操作

思路整理自题解,下面是本菜鸡的新手版= =

按位异或的性质

  1. x ⊕ x = 0
  2. x ⊕ 0 = x
  3. x ⊕ x+1 = 1,x为偶数(二进制最低位为0)。

推导

若start/2为偶数

上述结果可以进一步归纳:

若start/2为奇数

result/2
= (start/2-1 ⊕ start/2-1) ⊕ start/2 ⊕ start/2+1 ⊕ start/2+2 ⊕ start/2+3 ⊕ … ⊕ (start/2 + (n-1))
= start/2-1 ⊕ [start/2-1 ⊕ start/2 ⊕ start/2+1 ⊕ start/2+2 ⊕ start/2+3 ⊕ … ⊕ (start/2 + (n-1))]
x ⊕ x = 0start/2-1 ⊕ start/2-1 = 0;由x ⊕ 0 = x,上述变形成立。[]内又可以利用3.计算(类似偶数的情况)。

实现

双100%

class Solution {
    //half_start is even
    int half_res(int n, int half_start) {
        return n % 2 ? (half_start + n - 1 + ((n/2)&1)):((n/2)&1);
    }
public:
    int xorOperation(int n, int start) {
        int half;
        if(start / 2 % 2) { // odd
            half = (start/2 - 1) ^ half_res(n + 1, start/2 - 1);
        } else { // even
            half = half_res(n, start/2);
        }
        return half*2 + (start%2 ? (n&1) : 0);
    }
};
上一篇 下一篇

猜你喜欢

热点阅读