最全【算法学习】1486(2),写的太详细了

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

输入:
n = 1, start = 7
输出:
7


## 样例 4



输入:
n = 10, start = 5
输出:
2


## 提示


* 1 <= n <= 1000
* 0 <= start <= 1000
* n == nums.length




---


## 分析


我们可以直接按照题意,暴力循环,那么时间复杂度就是O(n),是否有时间复杂度为O(1)的算法呢?


记x为变量,^是异或操作,则异或运算满足以下性质:


1. x ^ x = 0;
2. x ^ 0 = x;
3. x ^ y = y ^ x(交换律);
4. (x ^ y) ^ z = x ^ (y ^ z)(结合律);
5. x ^ y ^ y = x(自反性);
6. 如果x是4的倍数,x ^ (x + 1) ^ (x + 2) ^ (x + 3) = 0;


* 本题要计算的 **结果公式** 为:**start ^ (start + 2) ^ (start + 4) ^ ⋯ ^(start + 2 \* (n − 1))**。
* 如果有一个函数 **sumXor(x)** 可以计算 **0 ^ 1 ^ 2 ^ ⋯ ^ x** 。
* 对于某变量x和n,计算sumXor(s - 1) ^ sumXor(s + n - 1)的结果,根据上面的 **性质1** 可以将 **0 ^ 1 ^ 2 ^ … ^ (s - 1)** 的值抵消为0,就变成 **0 ^ s ^ (s + 1) ^ (s + 2) ^ ⋯ ^ (s + n - 1)** ,根据 **性质2** 可知与0做异或操作还是自己,最后结果就变成 **s ^ (s + 1) ^ (s + 2) ^ ⋯ ^ (s + n - 1)** ,这个结果很接近我们要计算的内容。
* 如果我们令 **s = start / 2** ,把 **结果公式** 转换成 **(s ^ (s + 1) ^ (s + 2) ^ ⋯ ^ (s + n - 1)) \* 2**,这样并不成立,因为在做除以2的操作时,最低位丢失了,但是我们可以单独处理最低位。
* 观察 **结果公式** 可知 **(start + 2),(start + 4) ,… ,(start + 2 \* (n − 1))** 的奇偶性质相同,而且和start一致,也就是最低位要么都是0,要么都是1,只有基数个1做异或操作时才会是1。也就是只有start是奇数并且n是奇数的时候,最终结果的最低位 **e** 才会是1。
* 这时 **结果公式** 可以转化为: **((sumXor(s - 1) ^ sumXor(s + n - 1)) \* 2) | e** 。


只要我们可以实现函数sumXor(x),那么题目计算就可以做到O(1)的时间复杂度,根据 **性质6** 和 **性质2** 我们只需要考虑x除以4的余数,也就是最低2位,可以得到如下推导:


x % 4 = 0 的二进制位:**xx…x00**  
 x % 4 = 1 的二进制位:**xx…x01**  
 x % 4 = 2 的二进制位:**xx…x10**  
 x % 4 = 3 的二进制位:**xx…x11**


* x % 4 = 0,sumXor(x) = x;
* x % 4 = 1,sumXor(x) = (x - 1) ^ x,简化可得 sumXor(x) = 1;
* x % 4 = 2,sumXor(x) = (x - 2) ^ (x - 1) ^ x,简化可得 sumXor(x) = x | 1;
* x % 4 = 3,sumXor(x) = 0;
* x % 4 等同于 x & 3 的操作,而且理论上 & 操作要比 % 操作更快;




---


## 题解


### java



class Solution {
public int xorOperation(int n, int start) {
int s = start >> 1, e = n & start & 1;
int ret = sumXor(s - 1) ^ sumXor(s + n - 1);
return ret << 1 | e;
}

public int sumXor(int x) {
    switch (x & 3) {
        case 0:
            return x;
        case 1:
            return 1;
        case 2:
            return x | 1;
        default:
            // x & 3 == 3
            return 0;
    }
}

}




---


### c



int xorOperation(int n, int start) {
int s = start >> 1, e = n & start & 1;
int ret = sumXor(s - 1) ^ sumXor(s + n - 1);
return ret << 1 | e;
}

int sumXor(int x) {
switch (x & 3) {
case 0:
return x;
case 1:
return 1;
case 2:
return x | 1;
default:
// x & 3 == 3
return 0;
}
}




---


### c++



class Solution {
public:
int xorOperation(int n, int start) {
int s = start >> 1, e = n & start & 1;
int ret = sumXor(s - 1) ^ sumXor(s + n - 1);
return ret << 1 | e;
}

int sumXor(int x) {
    switch (x & 3) {
        case 0:
            return x;
        case 1:
            return 1;
        case 2:
            return x | 1;
        default:
            // x & 3 == 3
            return 0;
    }
}

};




---


### python



class Solution:
def xorOperation(self, n: int, start: int) -> int:
def sumXor(x):
if x % 4 == 0:
return x
if x % 4 == 1:
return 1
if x % 4 == 2:
return x | 1
return 0
s = start >> 1
e = n & start & 1
ans = sumXor(s - 1) ^ sumXor(s + n - 1)
return ans << 1 | e




---


### go



func xorOperation(n, start int) (ans int) {
s, e := start>>1, n&start&1
ret := sumXor(s-1) ^ sumXor(s+n-1)
return ret<<1 | e
}

func sumXor(x int) int {
switch x & 3 {
case 0:
return x
case 1:
return 1
case 2:
return x | 1
default:
return 0
}
}

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

561821274)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值