当前位置: 首页 > news >正文

1486. 数组异或操作

1486. 数组异或操作
题目含义:根据整数 n n n s t a r t start start 构造一个数组,数组元素为 n u m s [ i ] = 2 i + s t a r t , i ∈ [ 0 , n − 1 ] nums[i] = 2i + start, i \in [0,n-1] nums[i]=2i+start,i[0,n1];最后返回这个数组全部元素的异或结果。

我们可以根据异或运算的性质实现时间复杂度为 O ( 1 ) O(1) O(1)
⊕ \oplus 为异或运算,那么就有以下性质:
在这里插入图片描述
第 5 点性质,由于 x x x偶数时, x x x x + 1 x+1 x+1 只有最低位不同,所以 x ⊕ ( x + 1 ) = 1 x \oplus (x+1) = 1 x(x+1)=1;因此 0 ⊕ 1 ⊕ 2 ⊕ 3 = 1 ⊕ 1 = 0 0 \oplus 1 \oplus 2 \oplus 3 = 1 \oplus 1 = 0 0123=11=0

对于本题,我们需要求解 s t a r t ⊕ ( 2 + s t a r t ) ⊕ ( 4 + s t a r t ) ⊕ . . . ⊕ ( 2 ( n − 1 ) + s t a r t ) start \oplus (2 + start) \oplus (4 + start) \oplus ... \oplus (2(n-1) + start) start(2+start)(4+start)...(2(n1)+start) 的结果。
观察公式可以知道,这些元素的奇偶性质相同,因此它们的二进制表示中的最低位或者均为 1,或者均为 0。于是我们可以把参与运算的数的二进制位的最低位提取出来单独处理。当且仅当 start 为奇数,且 n 也为奇数时,结果的二进制位的最低位才为 1,我们将最低位用 e e e 存储。

此时,当我们把每个元素右移一位(除以 2),再将 s = s t a r t 2 s = \frac{start }{2} s=2start,得到
s ⊕ ( 1 + s ) ⊕ ( 2 + s ) . . . ⊕ ( ( n − 1 ) + s ) ⋅ 2 + e s \oplus (1 + s) \oplus (2 + s) ... \oplus ((n-1) + s) \cdot 2 + e s(1+s)(2+s)...((n1)+s)2+e
此时,我们需要求解 [ s , ( n − 1 ) + s ] [s, (n-1) + s] [s,(n1)+s] 这个序列的异或结果。
根据性质 5,我们知道,连续四个整数的异或结果为 0,那么就有以下四种情况:
在这里插入图片描述
其中, s u m X o r ( x ) sumXor(x) sumXor(x) 是一个函数,表示 0 ⊕ 1 ⊕ 2 ⊕ . . . ⊕ x 0 \oplus 1 \oplus 2 \oplus ... \oplus x 012...x
我们再进一步的化简:
在这里插入图片描述
x x x 为偶数时,所以 x ⊕ ( x + 1 ) = 1 x \oplus (x+1) = 1 x(x+1)=1
x = 4 k + 1 x=4k+1 x=4k+1,此时 x − 1 x-1 x1 是偶数,所以化简结果为 1;
x = 4 k + 2 x=4k+2 x=4k+2,此时 x − 2 x-2 x2 x x x 是偶数,所以 ( x − 2 ) ⊕ ( x − 1 ) = 1 (x-2) \oplus (x-1) = 1 (x2)(x1)=1,然后 x ⊕ 1 = x ⊕ 1 = x + 1 x \oplus 1 = x \oplus 1 = x + 1 x1=x1=x+1

那么
s ⊕ ( 1 + s ) ⊕ ( 2 + s ) . . . ⊕ ( ( n − 1 ) + s ) ⋅ 2 + b = [ 0 ⊕ 1 ⊕ . . . ⊕ ( s − 1 ) ] ⊕ [ 0 ⊕ 1 ⊕ . . . ⊕ ( s − 1 ) ] ⊕ [ s ⊕ ( 1 + s ) ⊕ ( 2 + s ) . . . ⊕ ( ( n − 1 ) + s ) ] = [ 0 ⊕ 1 ⊕ . . . ⊕ ( s − 1 ) ] ⊕ [ 0 ⊕ 1 ⊕ . . . ⊕ ( s − 1 ) ⊕ s ⊕ ( 1 + s ) . . . ⊕ ( ( n − 1 ) + s ) ] = s u m X o r ( s − 1 ) ⊕ s u m X o r ( s + n − 1 ) \begin{array}{l} s \oplus (1 + s) \oplus (2 + s) ... \oplus ((n-1) + s) \cdot 2 + b \\ = [0 \oplus 1 \oplus ... \oplus (s-1)] \oplus [0 \oplus 1 \oplus ... \oplus (s-1)] \oplus [s \oplus (1 + s) \oplus (2 + s) ... \oplus ((n-1) + s)] \\= [0 \oplus 1 \oplus ... \oplus (s-1)] \oplus [0 \oplus 1 \oplus ... \oplus (s-1) \oplus s \oplus (1 + s) ... \oplus ((n-1) + s)] \\ = sumXor(s-1) \oplus sumXor(s+n-1) \end{array} s(1+s)(2+s)...((n1)+s)2+b=[01...(s1)][01...(s1)][s(1+s)(2+s)...((n1)+s)]=[01...(s1)][01...(s1)s(1+s)...((n1)+s)]=sumXor(s1)sumXor(s+n1)
这样最后的结果即可表示为 ( s u m X o r ( s − 1 ) ⊕ s u m X o r ( s + n − 1 ) ) × 2 + e (sumXor(s−1)⊕sumXor(s+n−1))×2+e (sumXor(s1)sumXor(s+n1))×2+e

class Solution {
public:int xor_n(int n) {switch (n % 4) {case 0: return n;case 1: return 1;case 2: return n+1;default: return 0;}}int xorOperation(int n, int start) {int e = 1 & n & start, s = start / 2;int ret = xor_n(s-1) ^ xor_n(s + n - 1);return ret * 2 + e;}
};

http://www.mrgr.cn/news/50093.html

相关文章:

  • TypeScript类型体操7
  • sql优化
  • SVN——常见问题
  • 如何在 Jupyter Notebook 执行和学习 SQL 语句(上)—— 基本原理详解和相关库安装篇
  • (十二)rsync 远程数据同步
  • 深度学习架构:MOE架构
  • FFmpeg 4.3 音视频基础到工程应用-多路H265监控录放C++开发一 : 环境搭建1 vs2019 安装,
  • 【C语言】动态内存管理(下)
  • mysql学习教程,从入门到精通,SQL导入数据(43)
  • 生信技能61 - 获取比对后BAM文件的多项基础统计指标
  • 基于FPGA的以太网设计(三)
  • 本地DLL劫持
  • Java基础概览和常用知识(五)
  • 机器学习篇-day07-朴素贝叶斯和特征降维
  • 已发布金融国家标准目录(截止2024年3月)
  • 算法工程师重生之第二十五天(加油站 分发糖果 柠檬水找零 根据身高重建队列 )
  • 【React】父组件如何调用子组件的方法
  • RTThread-Nano学习一-基于MDK移植
  • 基于Arduino的车辆门禁管理系统
  • Python中的itertools模块详解