位运算 -- 力扣

news2024/11/29 11:37:01

1486. 数组异或操作

1486. 数组异或操作
根据题意,使用参数 nstart 生成一个数组,最后返回数组中所有元素按位异或(XOR)后得到的结果。

首先,异或运算的规则是,当同一位的二进制数不同时结果为 1,否则为 0,比如 101 ⊕ 111 = 010 101 \oplus 111 = 010 101111=010
它有以下相关的性质:

  1. x ⊕ x = 0 x \oplus x = 0 xx=0
  2. x ⊕ 0 = x x \oplus 0 = x x0=x
  3. x ⊕ y = y ⊕ x x \oplus y = y \oplus x xy=yx
  4. ( x ⊕ y ) ⊕ z = x ⊕ ( y ⊕ z ) (x \oplus y) \oplus z = x \oplus (y \oplus z) (xy)z=x(yz)
  5. x ⊕ y ⊕ y = x x \oplus y \oplus y = x xyy=x
  6. ∀ i ∈ Z \forall i \in Z iZ 4 i ⊕ ( 4 i + 1 ) ⊕ ( 4 i + 2 ) ⊕ ( 4 i + 5 ) = 0 4i \oplus (4i+1) \oplus (4i+2) \oplus (4i+5) = 0 4i(4i+1)(4i+2)(4i+5)=0
  7. 当一个奇数和一个偶数进行异或运算时,结果的最低位一定是 1,比如 2 和 3。

额外的,如果 x 是偶数, x ⊕ 1 = x + 1 x \oplus 1 = x+1 x1=x+1;如果 x 是奇数, x ⊕ 1 = x − 1 x \oplus 1 = x-1 x1=x1。比如 6 ⊕ 1 = 110 ⊕ 001 = 111 = 7 6 \oplus 1=110 \oplus 001=111=7 61=110001=111=7 5 ⊕ 1 = 101 ⊕ 001 = 100 = 4 5 \oplus1=101 \oplus 001=100=4 51=101001=100=4

在本题中,我们需要计算 s t a r t ⊕ ( s t a r t + 2 ) ⊕ ( s t a r t + 4 ) ⊕ ⋯ ⊕ ( s t a r t + 2 ( n − 1 ) ) (1) start \oplus (start+2) \oplus (start+4) \oplus ⋯ \oplus (start+2(n−1)) \tag{1} start(start+2)(start+4)(start+2(n1))(1)
观察公式可以知道,这些数的奇偶性相同,因此它们的二进制表示中的最低位要么均为 1,要么均为 0。
于是我们可以把参与运算的数的二进制位的最低位提取出来单独处理。当且仅当 start 为奇数,且 n 也为奇数时,结果的二进制位的最低位才为 1,因此最低位 e 为 e = 1 & n & start

当 n = 4 时,start = 2,nums=[2, 4, 6, 8],最低位 e 为 0;
当 n = 4 时,start = 1,nums=[1, 3, 5, 7],最低位 e 为 0,原因:两个奇数进行异或操作结果为 0,因此偶数个奇数的最低位为 0;
当 n = 3 时,start = 1,nums=[1, 3, 5],最低位 e 为 1,原因: 0 ⊕ 1 = 1 0 \oplus 1 = 1 01=1

此时我们可以将公式转化为 ( s ⊕ ( s + 1 ) ⊕ ( s + 2 ) ⊕ ⋯ ⊕ ( s + n − 1 ) ) × 2 + e (2) (s \oplus (s+1) \oplus (s+2) \oplus ⋯ \oplus (s+n−1))×2+e \tag{2} (s(s+1)(s+2)(s+n1))×2+e(2) 其中 s = ⌊ s t a r t 2 ⌋ s=⌊\frac{start}{2}⌋ s=2start e e e 表示运算结果的最低位。舍去最低位后的数列恰成为一串连续的整数。

首先,将所有参与异或的元素都删除最后一位,即为右移一位, s t a r t 2 ⊕ s t a r t + 2 2 ⊕ s t a r t + 4 2 ⊕ . . . ⊕ s t a r t + 2 ( n − 1 ) 2 = s t a r t 2 ⊕ ( s t a r t 2 + 1 ) ⊕ ( s t a r t 2 + 2 ) ⊕ ⋯ ⊕ ( s t a r t 2 + n − 1 ) \frac{start}{2} \oplus \frac{start+2}{2} \oplus \frac{start+4}{2} \oplus ... \oplus \frac{start+2(n−1)}{2} = \frac{start}{2} \oplus (\frac{start}{2}+1)\oplus (\frac{start}{2}+2) \oplus ⋯ \oplus (\frac{start}{2}+n−1) 2start2start+22start+4...2start+2(n1)=2start(2start+1)(2start+2)(2start+n1)
然后,用上面得到的结果乘于 2,相当于左移一位,再加上最后一位值 e,使用 s s s 代替 s t a r t 2 \frac{start}{2} 2start,因此公式(1) 变为: ( s ⊕ ( s + 1 ) ⊕ ( s + 2 ) ⊕ ⋯ ⊕ ( s + n − 1 ) ) × 2 + e (s \oplus (s+1) \oplus (s+2) \oplus ⋯ \oplus (s+n−1))×2+e (s(s+1)(s+2)(s+n1))×2+e

这样我们可以描述一个函数 s u m X o r ( x ) sumXor(x) sumXor(x),表示 0 ⊕ 1 ⊕ 2 ⊕ ⋯ ⊕ x 0 \oplus 1 \oplus 2 \oplus ⋯ \oplus x 012x。利用异或运算的性质 6,我们可以将计算该函数的复杂度降低到 O(1),因为以 4 i 4i 4i 为开头的连续四个整数异或的结果为 0,所以 s u m X o r ( x ) sumXor(x) sumXor(x) 可以被表示为:
在这里插入图片描述
化简后的形式:
在这里插入图片描述

当 x = 4k 时,元素有 [0, 1, 2, …, 4k],因为前面的 [0,1, 2, …, 4k-1] 的异或操作的结果为 0,最后只剩下元素 x=4k;
当 x = 4k+1 时,剩下的元素有 ( x − 1 ) ⊕ x (x−1) \oplus x (x1)x,根据上面性质7,这个化简后的结果为 1;
当 x = 4k+2 时,剩下的元素有 ( x − 2 ) ⊕ ( x − 1 ) ⊕ x = 1 ⊕ ( 4 k + 2 ) = x ⊕ 1 = x + 1 (x−2) \oplus (x−1) \oplus x = 1 \oplus (4k+2) = x \oplus 1 = x+1 (x2)(x1)x=1(4k+2)=x1=x+1,其中 x x x 是偶数;
当 x = 4k+3 时,剩下的元素有 ( x − 3 ) ⊕ ( x − 2 ) ⊕ ( x − 1 ) ⊕ x (x−3) \oplus (x−2) \oplus (x−1) \oplus x (x3)(x2)(x1)x,其中 ( x − 3 ) ⊕ ( x − 2 ) = ( x − 1 ) ⊕ x = 0 (x−3) \oplus (x−2) = (x−1) \oplus x = 0 (x3)(x2)=(x1)x=0,参考上面性质7。

“以 4 i 4i 4i 为开头的连续四个整数异或的结果为 0” :连续四个整数的异或结果为 0,即为 k ⊕ ( k + 1 ) ⊕ ( k + 2 ) ⊕ ( k + 3 ) = 0 k \oplus (k+1) \oplus (k+2) \oplus (k+3)=0 k(k+1)(k+2)(k+3)=0,所以以 4 的倍数为起点(即 k = 4 i k=4i k=4i)的四个连续整数的异或结果也为 0。这个性质使得我们在处理长度为 4 的一组数时,不需要逐一计算它们的异或结果,而是直接知道它们的异或为 0,将问题的规模大幅缩小。

根据公式 (2),我们需要计算出[s, s+1, …, s+n-1] 这个范围的异或结果,设这个结果为 x x x
显然 s u m X o r ( s − 1 ) ⊕ x = s u m X o r ( s + n − 1 ) sumXor(s-1) \oplus x = sumXor(s+n-1) sumXor(s1)x=sumXor(s+n1)。根据性质 3 和 5 可得出 x = s u m X o r ( s − 1 ) ⊕ s u m X o r ( s + n − 1 ) x = sumXor(s-1) \oplus sumXor(s+n-1) x=sumXor(s1)sumXor(s+n1),其中 s u m X o r ( s + n − 1 ) sumXor(s+n−1) sumXor(s+n1) 表示从 0 到 s+n−1 的所有元素的异或结果。

流程:
① 计算参与运算的数的二进制位的最低位的值 e;
② 计算 s = ⌊ s t a r t 2 ⌋ s=⌊\frac{start}{2}⌋ s=2start
③ 分别计算 s u m X o r ( s + n − 1 ) sumXor(s+n-1) sumXor(s+n1) s u m X o r ( s − 1 ) sumXor(s-1) sumXor(s1),再对这两个结果进行异或操作得到 ret;
④ 计算 ret * 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;
    }
};
var xorOperation = function(n, start) {
    const xor_n = (num) => {
        switch(num % 4) {  
            case 0: return num;   // 4k % 4 = 0
            case 1: return 1;
            case 2: return num+1;
            default: return 0;
        }
    }
    const e = 1 & n & start, s = start >> 1;  
    const ret = xor_n(s-1) ^ xor_n(s+n-1);
    return ret * 2 + e;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Golang】Go 语言中的 time 包详解:全面掌握时间处理与应用

在 Go 语言中,time 包提供了强大的时间处理功能,适用于各种场景:获取当前时间、格式化和解析时间、计算时间间隔、设置定时器、处理超时等。在开发过程中,熟练掌握 time 包能够帮助我们轻松处理时间相关的操作,尤其是定…

小程序之获取用户头像与昵称

html 这个是通过一个点击事件进行显示的,下面是效果图,获取头像最关键的是 open-type"chooseAvatar" ,获取昵称最关键的是 type"nickname" ,大家多加注意i哦 <!-- 大的输入调取 --><view class"myis_box" wx:if"{{showMyisBox}}…

做ppt用什么软件好?5个办公必备的ppt工具推荐!

ppt用什么软件做&#xff1f; 相信很多人看到这个&#xff0c;会第一时间想到Microsoft Office套件包含的幻灯片软件Powerpoint&#xff0c;它的名声甚广&#xff0c;以至于某种程度上成了PPT的代名词。 在Powerpoint之外&#xff0c;这些年也陆续诞生了各式各样的PPT软件&am…

CocosCreator 快速部署 TON 游戏:Web2 游戏如何使用 Ton支付

在本篇文章中&#xff0c;我们将继续探讨如何使用 Cocos Creator 开发 Telegram 游戏&#xff0c;重点介绍如何集成 TON 支付功能。通过这一教程&#xff0c;开发者将学会如何在游戏中接入 TON Connect&#xff0c;实现钱包连接、支付以及支付后的校验流程&#xff0c;最终为 W…

YOLO11改进|SPPF篇|引入SPPFCSPC金字塔结构

目录 一、【SPPFCSPC】金字塔结构1.1【SPPFCSPC】金字塔结构介绍1.2【SPPFCSPC】核心代码 二、添加【SPPFCSPC】金字塔结构2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPFCSPC】金字塔结构 1.1【SPPFCSPC】金字塔结构介绍 下图是…

vue后台管理系统从0到1(1)

文章目录 vue后台管理系统从0到1&#xff08;1&#xff09;nvm 下载安装1.卸载nodejs环境2.安装nvm 安装nrm vue后台管理系统从0到1&#xff08;1&#xff09; 第一节主要是先安装我们的工具nvm nodejs版本管理工具&#xff0c;和nrm镜像管理工具 nvm 下载安装 nvm是一款管理…

网络流量预测的学习——持续更新ing

文章目录 前情提要何为网络流量网络流量分析&#xff08;NTA&#xff09;网络流量组成网络流量处理过程 预测网络流量的工具wiresharkbrim&#xff08;zui&#xff09; 机器学习中的网络流量预测参考文章 前情提要 记录一些有关网络流量的学习 何为网络流量 网络流量是指在计…

【D3.js in Action 3 精译_033】4.1.0 DIY 实战:如何通过学习 d3.autoType 函数深度参与 D3 生态建设

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

又被特斯拉演了?继续“画饼式”发布Robotaxi,产业链静观其变

9月底的暴涨后&#xff0c;A股资产正经历回调&#xff0c;科技板块变现参差。不过&#xff0c;无人驾驶领域的预期依然很强。 10月10日科技股全线调整之际&#xff0c;无人驾驶板块盘中的巨幅震荡拉升就是典型的预热动作。东箭科技、天龙股份等多只智能驾驶个股涨停。核心驱动…

ACR、PZ、AMC仪表接线说明及通讯协议解析

1.ACR/PZ/AMC多功能表接线说明 三相三线接线说明 使用场合负载是平衡系统&#xff0c;并且没有零线的场合。 1. 端子号1&#xff0c;2为辅助电源&#xff1a; 如上图&#xff0c;接入相电压220V输入。其中辅助电源的火线加装5A保险丝&#xff0c;零线直接接到零排上。 2&am…

iPhone使用指南:如何在没有备份的情况下从 iPhone 恢复已删除的照片

本指南将向您展示如何在没有备份的情况下从 iPhone 恢复已删除的照片。我们所有人在生活中的某个时刻都一定做过一些愚蠢的事情&#xff0c;例如从手机或电脑中删除一些重要的东西。这是很自然的&#xff0c;没有什么可羞耻的。您可能在辛苦工作一天后回来。当突然想看一些照片…

C++开发五子棋游戏案例详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

JavaSE——集合3:ArrayList、Vector

目录 一、ArrayList的注意事项 二、ArrayList的扩容机制(重要) 三、Vector底层结构和源码剖析 1.Vector类的定义说明 2.Vector底层也是一个对象数组 3.Vector是线程同步的&#xff0c;即线程安全&#xff0c;Vector类的操作方法带有synchronized 4.在开发中&#xff0c…

obs录屏怎么样?四大优秀录屏工具亲测好用!

录屏需求日盛&#xff0c;接下来我们就来聊聊几款市面上较为热门的录屏软件——福昕录屏大师、转转大师录屏、爱拍录屏以及经典的obs录屏&#xff0c;希望能给寻找合适录屏工具的您带来一些灵感。 福昕录屏大师 直达链接&#xff1a;www.foxitsoftware.cn/REC/ 如果你刚开始…

如何在组织内推广和应用六西格玛设计?

六西格玛设计&#xff08;Design for Six Sigma, DFSS&#xff09;作为一种先进的流程设计和优化方法论&#xff0c;旨在通过设计阶段的创新与严谨&#xff0c;确保产品或服务从一开始就具备高度的质量和客户满意度。本文&#xff0c;深圳天行健企业管理咨询公司将深入探讨如何…

HCIP--以太网交换安全(三)MAC地址漂移防止与检测

MAC地址漂移防止与检测 一、MAC地址漂移防止与检测知识点 1.1MAC地址漂移的概述 MAC地址漂移是指交换机上一个vlan内有两个端口学习到同一个MAC地址&#xff0c;后学习到的MAC地址表项覆盖原MAC地址表项的现象。 1.2.MAC地址漂移的防止方法 &#xff08;1&#xff09;配置…

浸入式电磁流量计如何工作?

磁力如何产生可感应电压&#xff1f; 所有磁流量计都利用法拉第感应定律的指导原理&#xff0c;该定律显示了“表达变化的磁场在电路中感应出电压的定量关系”。 该感应定律可用于测量导体液体&#xff08;如水&#xff09;的速度&#xff0c;而无需移动部件。与其他类型的仪…

『网络游戏』游戏数据库管理类查询插入账号存储【23】

新建数据库连接 新建数据库 打开数据库 新建表 账号数据 设计表 - 添加属性 对照服务器工程GameMsg增加对应字段 保存后在服务器脚本中操作数据库数据 添加数据层文件夹 创建脚本&#xff1a;DBMgr 编写脚本&#xff1a;DBMgr.cs 修改脚本&#xff1a;ServerRoot.cs 将MySql.d…

两个数相加(c语言)

1./给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target // 的那 两个 整数&#xff0c;并返回它们的数组下标。 //你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。你可以按任意顺序返回答案。 /…

“城市酷选”排队免单模式:创新机制引领本地消费新风尚

近期&#xff0c;众多朋友对排队免单模式展现出浓厚兴趣&#xff0c;旨在借助商家优惠吸引顾客&#xff0c;激活本地商业活力&#xff0c;推动实体消费。自去年下半年起&#xff0c;本地生活服务平台热度持续攀升&#xff0c;其中&#xff0c;排队免单模式作为多商家联合的优惠…