力扣 1486

题目内容:
给你两个整数,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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值