题目内容:
给你两个整数,n 和 start 。
数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。
请返回 nums 中所有元素按位异或(XOR)后得到的结果。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xor-operation-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目可以通过简单的遍历得到结果,但算法的时间复杂度为o(n),如果要降低时间复杂度的话,则要利用异或的数学性质对内容进行推导。异或的主要数学性质如下:
① x ⊕ y = y ⊕ x
② x ⊕ x = 0
③ x ⊕ (y⊕z) = (x ⊕ y) ⊕ z
④ 0 ⊕ x = x
同时可以注意到,对于从4的整数倍开始的连续的四个数,其异或为0,例,0⊕1⊕2⊕3=0,那么则可以用一个函数来计算从0到n的异或和:
int sumxor(int x)
{
int t=0;
switch(x%4){#只取4的整数倍后剩下的几个数进行计算
case 0:%只留下一个,就是x
t = x;
break;
case 1:%留下x和x+1,异或后为1
t = 1;
break;
case 2:
t = x+1;
break;
case 3:
t = 0;
break;
}
return t;
}
同时又有性质②,则从a到b的异或就可以通过sumxor(a-1) ⊕ sumxor(b)来得到。
回归到题目,由于题目中的数据是连续加2的,则需要对数字进行除以2的处理,来得到连续的数字,计算完成后,再将数字乘2同时补上最后一位即可。最后代码如下:
int xorOperation(int n, int start) {
int s=start/2;
int result=0;
int last=0;
if(n%2==1&&start%2==1){%对于最后一位,由于数字是以2为间隔的,所以所有数字的末位都一样,只有当start和n同时为奇数时,异或的最后一位才会为1
last=1;
}
else
{
last=0;
}
result=sumxor(s+n-1)^sumxor(s-1);
result=result<<1|last;
return result;
}