位运算题目:数组异或操作

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:数组异或操作

出处:1486. 数组异或操作

难度

1 级

题目描述

要求

给你两个整数, n \texttt{n} n start \texttt{start} start

定义数组 nums \texttt{nums} nums,其中 nums[i] = start + 2 × i \texttt{nums[i]} = \texttt{start} + \texttt{2} \times \texttt{i} nums[i]=start+2×i(下标从 0 \texttt{0} 0 开始)且 n = nums.length \texttt{n} = \texttt{nums.length} n=nums.length

返回 nums \texttt{nums} nums 中所有元素按位异或的结果。

示例

示例 1:

输入: n   =   5,   start   =   0 \texttt{n = 5, start = 0} n = 5, start = 0
输出: 8 \texttt{8} 8
解释:数组 nums \texttt{nums} nums [0,   2,   4,   6,   8] \texttt{[0, 2, 4, 6, 8]} [0, 2, 4, 6, 8] 0 ⊕ 2 ⊕ 4 ⊕ 6 ⊕ 8 = 8 \texttt{0} \oplus \texttt{2} \oplus \texttt{4} \oplus \texttt{6} \oplus \texttt{8} = \texttt{8} 02468=8,其中 ⊕ \oplus 为按位异或运算符。

示例 2:

输入: n   =   4,   start   =   3 \texttt{n = 4, start = 3} n = 4, start = 3
输出: 8 \texttt{8} 8
解释:数组 nums \texttt{nums} nums [3,   5,   7,   9] \texttt{[3, 5, 7, 9]} [3, 5, 7, 9] 3 ⊕ 5 ⊕ 7 ⊕ 9 = 8 \texttt{3} \oplus \texttt{5} \oplus \texttt{7} \oplus \texttt{9} = \texttt{8} 3579=8

数据范围

  • 1 ≤ n ≤ 1000 \texttt{1} \le \texttt{n} \le \texttt{1000} 1n1000
  • 0 ≤ start ≤ 1000 \texttt{0} \le \texttt{start} \le \texttt{1000} 0start1000
  • n = nums.length \texttt{n} = \texttt{nums.length} n=nums.length

解法一

思路和算法

最直观的方法是遍历数组 nums \textit{nums} nums 中的全部 n n n 个元素,计算按位异或的结果。

由于已知 nums [ i ] = start + 2 × i \textit{nums}[i] = \textit{start} + 2 \times i nums[i]=start+2×i,且数组的长度 n n n 和数组的首个元素 start \textit{start} start 已知,因此不需要显性创建数组,而是可以按照数组的元素值遍历。

代码

class Solution {
    public int xorOperation(int n, int start) {
        int xor = 0;
        for (int i = 0; i < n; i++) {
            xor ^= start + 2 * i;
        }
        return xor;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 nums \textit{nums} nums 的长度。需要遍历 n n n 个元素计算按位异或的结果。

  • 空间复杂度: O ( 1 ) O(1) O(1)

解法二

思路和算法

利用按位异或的性质,可以使用 O ( 1 ) O(1) O(1) 的时间得到结果。

根据按位异或的性质,对于二进制表示中的特定位,如果该位出现奇数个 1 1 1 则按位异或的结果是 1 1 1,如果该位出现偶数个 1 1 1 则按位异或的结果是 0 0 0

由于数组 nums \textit{nums} nums 中的任意两个相邻元素之差都是 2 2 2,因此数组 nums \textit{nums} nums 中的所有元素的奇偶性相同。只有当 n n n start \textit{start} start 都是奇数时,按位异或的结果才是奇数,否则按位异或的结果是偶数。将一个奇数减 1 1 1 的效果是将该奇数的二进制表示的最低位 1 1 1 变成 0 0 0,其余位不变。如果数组 nums \textit{nums} nums 中的所有元素都是奇数,则数组 nums \textit{nums} nums 中的所有元素按位异或的结果(以下简称「数组按位异或结果」)可以通过如下方式计算:将数组 nums \textit{nums} nums 中的所有元素减 1 1 1,得到 n n n 个偶数,计算这 n n n 个偶数的按位异或结果,记为 x x x,如果 n n n start \textit{start} start 都是奇数则数组按位异或结果为 x + 1 x + 1 x+1,否则数组按位异或结果为 x x x

首先根据 n n n start \textit{start} start 的奇偶性得到数组按位异或结果的奇偶性,如果 start \textit{start} start 是奇数则将 start \textit{start} start 的值减 1 1 1,然后计算 n n n 个连续偶数的按位异或结果。

根据按位异或的性质,对于任意非负整数 k k k 8 k ⊕ ( 8 k + 2 ) ⊕ ( 8 k + 4 ) ⊕ ( 8 k + 6 ) = 0 8k \oplus (8k + 2) \oplus (8k + 4) \oplus (8k + 6) = 0 8k(8k+2)(8k+4)(8k+6)=0,因此对于任意非负偶数 num \textit{num} num,可以根据 num \textit{num} num 除以 8 8 8 的余数快速计算范围 [ 0 , num ] [0, \textit{num}] [0,num] 中的所有偶数的按位异或结果。

  • 如果 num \textit{num} num 除以 8 8 8 的余数是 0 0 0,则从 0 0 0 num − 2 \textit{num} - 2 num2 的所有偶数为若干组 [ 8 k , 8 k + 6 ] [8k, 8k + 6] [8k,8k+6],因此范围 [ 0 , num − 2 ] [0, \textit{num} - 2] [0,num2] 中的所有偶数的按位异或结果是 0 0 0 [ 0 , num ] [0, \textit{num}] [0,num] 中的所有偶数的按位异或结果是 num \textit{num} num

  • 如果 num \textit{num} num 除以 8 8 8 的余数是 2 2 2,则范围 [ 0 , num − 4 ] [0, \textit{num} - 4] [0,num4] 中的所有偶数的按位异或结果是 0 0 0 [ 0 , num ] [0, \textit{num}] [0,num] 中的所有偶数的按位异或结果是 ( num − 2 ) ⊕ num = 2 (\textit{num} - 2) \oplus \textit{num} = 2 (num2)num=2

  • 如果 num \textit{num} num 除以 8 8 8 的余数是 4 4 4,则范围 [ 0 , num − 6 ] [0, \textit{num} - 6] [0,num6] 中的所有偶数的按位异或结果是 0 0 0 [ 0 , num ] [0, \textit{num}] [0,num] 中的所有偶数的按位异或结果是 ( num − 4 ) ⊕ ( num − 2 ) ⊕ num = ( num − 4 ) + 6 = num + 2 (\textit{num} - 4) \oplus (\textit{num} - 2) \oplus \textit{num} = (\textit{num} - 4) + 6 = \textit{num} + 2 (num4)(num2)num=(num4)+6=num+2

  • 如果 num \textit{num} num 除以 8 8 8 的余数是 6 6 6,则范围 [ 0 , num ] [0, \textit{num}] [0,num] 中的所有偶数的按位异或结果是 0 0 0

xor 1 \textit{xor}_1 xor1 表示范围 [ 0 , start − 2 ] [0, \textit{start} - 2] [0,start2] 中的所有偶数的按位异或结果(当 start = 0 \textit{start} = 0 start=0 xor 1 = 0 \textit{xor}_1 = 0 xor1=0),用 xor 2 \textit{xor}_2 xor2 表示范围 [ 0 , start + 2 × ( n − 1 ) ] [0, \textit{start} + 2 \times (n - 1)] [0,start+2×(n1)] 中的所有偶数的按位异或结果,用 xor \textit{xor} xor 表示范围 [ start , start + 2 × ( n − 1 ) ] [\textit{start}, \textit{start} + 2 \times (n - 1)] [start,start+2×(n1)] 中的所有偶数的按位异或结果,则 xor 1 \textit{xor}_1 xor1 xor 2 \textit{xor}_2 xor2 可以根据上述方法计算得到, xor \textit{xor} xor 是需要计算的结果。

由于 xor 2 = xor 1 ⊕ xor \textit{xor}_2 = \textit{xor}_1 \oplus \textit{xor} xor2=xor1xor,因此有 xor = xor ⊕ xor 1 ⊕ xor 1 = xor 2 ⊕ xor 1 \textit{xor} = \textit{xor} \oplus \textit{xor}_1 \oplus \textit{xor}_1 = \textit{xor}_2 \oplus \textit{xor}_1 xor=xorxor1xor1=xor2xor1,即 xor \textit{xor} xor 的值等于 xor 2 ⊕ xor 1 \textit{xor}_2 \oplus \textit{xor}_1 xor2xor1

得到 xor \textit{xor} xor 的值之后,如果 n n n start \textit{start} start 都是奇数则返回 xor + 1 \textit{xor} + 1 xor+1,否则返回 xor \textit{xor} xor

代码

class Solution {
    public int xorOperation(int n, int start) {
        int odd = n & start & 1;
        start -= start & 1;
        return getPrefixXor(start + 2 * (n - 1)) ^ getPrefixXor(start - 2) + odd;
    }

    public int getPrefixXor(int num) {
        if (num <= 0) {
            return 0;
        }
        int remainder = num % 8;
        if (remainder == 0) {
            return num;
        } else if (remainder == 2) {
            return 2;
        } else if (remainder == 4) {
            return num + 2;
        } else {
            return 0;
        }
    }
}

复杂度分析

  • 时间复杂度: O ( 1 ) O(1) O(1)

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件实现I2C常用寄存器简单介绍

引言 在深入探讨I2C外设的具体案例之前&#xff0c;理解其核心寄存器的配置至关重要。这些寄存器不仅控制着I2C模块的基本操作模式&#xff0c;如数据传输速率和地址识别&#xff0c;还负责管理更复杂的通信需求&#xff0c;例如中断处理、DMA交互及错误检测与恢复。接下来的内…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解&#xff0c;欢迎大佬指出我文章的问题&#xff0c;一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表&#xff1f;k8s nodeport模式的原理&#xff1f; 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

linux中,软硬链接的作用和使用

一、软硬链接的作用 软硬链接&#xff0c;是大家所熟系的内容了。链接就是方便人使用电脑上访问文件、方便进程访问文件的工具。比如软连接大家都有见过&#xff0c;在安装某款软件的时候要不要添加快捷方式。在windows系统上&#xff0c;我们右键点击文件的时候按‘s’就能创建…

kalman滤波器C++设计仿真实例第三篇

1. 仿真场景 水面上有条船在做匀速直线航行&#xff0c;航行过程中由于风和浪的影响&#xff0c;会有些随机的干扰&#xff0c;也就是会有些随机的加速度作用在船身上&#xff0c;这个随机加速度的均方差大约是0.1&#xff0c;也就是说方差是0.01。船上搭载GPS设备&#xff0c;…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

[c语言日寄]浮点数在内存中的储存

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

【文档智能】Qwen2.5-VL在版式分析和表格识别上的实际评测效果

qwen开年开源了Qwen2.5-VL系列权重模型&#xff0c;笔者观察到相较于传统的多模态系列&#xff0c;增加了文档理解功能。笔者以文档智能中两个比较重要的任务版式分析和表格识别&#xff0c;笔者直接测试下Qwen2.5-VL-72B的效果。 版式分析 case1 case2 这个case没有输出bbox…

【计算机组成原理】1_绪论

chap1 绪论 1. 国产芯片现状 MIPS阵营&#xff1a;龙芯X86阵营&#xff08;常见于桌面和服务器&#xff09;&#xff1a;兆芯&#xff08;VIA&#xff09;&#xff0c;海光&#xff08;AMD&#xff09;ARM阵营&#xff08;常见于移动嵌入式、手机平板等&#xff09;&#xff…

解锁反序列化漏洞:从原理到防护的安全指南

目录 前言 一、什么是反序列化 二、反序列化漏洞原理 三、反序列化漏洞的危害 &#xff08;一&#xff09;任意代码执行 &#xff08;二&#xff09;权限提升 &#xff08;三&#xff09;数据泄露与篡改 四、常见的反序列化漏洞场景 &#xff08;一&#xff09;PHP 反…

openGauss 3.0 数据库在线实训课程1:学习数据库状态查看

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习从操作系统层面和使用openGauss工具查看数据库的状态、版本和数据文件目录。 课程作业 gs_ctl是openGauss提…

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 开发工具&#xff1a;pycharm、Visual Studio Code、HbuildX 数据库&#xff1a;MySQL 5.7.26&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

IMX6ULL环境搭建遇到的问题和解答更新

IMX6ULL环境搭建遇到的问题 开发板&#xff1a;正点原子IMX6ULL 终端软件串口控制&#xff1a;MobaXterm 1、网络环境搭建三方互ping不通 电脑无网口&#xff0c;使用绿联USB转网口&#xff0c;接网线直连开发板&#xff0c;电脑WiFi上网 按文档设置的 IP 地址&#xff0c;以…

Windows Docker笔记-Docker拉取镜像

通过在前面的章节《安装docker》中&#xff0c;了解并安装成功了Docker&#xff0c;本章讲述如何使用Docker拉取镜像。 使用Docker&#xff0c;主要是想要创建并运行Docker容器&#xff0c;而容器又要根据Docker镜像来创建&#xff0c;那么首当其冲&#xff0c;必须要先有一个…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART&#xff08;Universal Asynchronous Recei…

外置互感器导轨式电能表

1 概述 1 Overview ADL系列导轨式多功能电能表&#xff0c;是主要针对于光伏并网系统、微逆系统、储能系统、交流耦合系统等新能源发电系统而设计的一款智能仪表&#xff0c;产品具有精度高、体积小、响应速度快、安装方便等优点。具有对电力参数进行采样计量和监测&#xff…

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台&#xff0c;以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去&#xff0c;NoSQL 数据库提供云专用解决方案&#xff0c;而没有通用的互操作性标准。这导致对可互操作、可移植…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步&#xff1a;组态1214CPU&#xff0c;勾选时钟存储器 第二步&#xff1a;防护与安全里面连接机制勾选允许PUT/GET访问 第三步&#xff1a;添加PLC 第四步&#xff1a;点击网络试图&#xff0c;选中网口&#xff0c;把两个PLC连接起…