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

【Leetcode】2683. 相邻值的按位异或

文章目录

  • 题目
  • 思路
  • 代码
    • C++
    • Java
    • Python
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗

题目描述:
给定一个长度为 n 的 derived 数组,判断是否存在一个长度为 n 的二进制数组 original,使得:

  • derived[i] = original[i] ⊕ original[(i + 1) % n]

其中 ⊕ 表示按位异或运算。

思路

这道题的关键在于理解异或运算的性质:

  1. 异或的对称性a ⊕ b = b ⊕ a
  2. 异或的结合律(a ⊕ b) ⊕ c = a ⊕ (b ⊕ c)
  3. 自异或为0a ⊕ a = 0

核心观察:
如果存在有效的原始数组,那么所有 derived 数组元素的异或和必须为 0。

证明:

derived[0] = original[0] ⊕ original[1]
derived[1] = original[1] ⊕ original[2]
derived[2] = original[2] ⊕ original[3]
...
derived[n-1] = original[n-1] ⊕ original[0]

将所有等式异或:

derived[0] ⊕ derived[1] ⊕ ... ⊕ derived[n-1] 
= (original[0] ⊕ original[1]) ⊕ (original[1] ⊕ original[2]) ⊕ ... ⊕ (original[n-1] ⊕ original[0])
= original[0] ⊕ original[0] ⊕ original[1] ⊕ original[1] ⊕ ... ⊕ original[n-1] ⊕ original[n-1]
= 0

每个 original[i] 都出现了两次,异或后为 0。

算法步骤:

  1. 特殊情况:如果数组长度为1,当且仅当 derived[0] = 0 时有解
  2. 一般情况:计算所有 derived 元素的异或和,如果为0则有解

代码

C++

class Solution {
public:bool doesValidArrayExist(vector<int>& derived) {// 特殊情况:长度为1if(derived.size() == 1) {return !derived[0];  // derived[0] = original[0] ⊕ original[0] = 0}// 计算所有元素的异或和int xorSum = 0;for(int num : derived) {xorSum ^= num;}// 当且仅当异或和为0时有解return xorSum == 0;}
};

Java

class Solution {public boolean doesValidArrayExist(int[] derived) {// 特殊情况:长度为1if(derived.length == 1) {return derived[0] == 0;}// 计算所有元素的异或和int xorSum = 0;for(int num : derived) {xorSum ^= num;}// 当且仅当异或和为0时有解return xorSum == 0;}
}

Python

class Solution:def doesValidArrayExist(self, derived: List[int]) -> bool:# 特殊情况:长度为1if len(derived) == 1:return derived[0] == 0# 计算所有元素的异或和xor_sum = 0for num in derived:xor_sum ^= num# 当且仅当异或和为0时有解return xor_sum == 0

复杂度分析

时间复杂度

  • O(n):需要遍历整个 derived 数组一次来计算异或和

空间复杂度

  • O(1):只使用了常数级别的额外空间

结果

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
  • 通过所有测试用例

总结

这道题的关键在于发现数学规律:

  1. 异或运算的性质:每个原始数组元素在异或计算中出现且仅出现两次
  2. 必要充分条件:derived数组所有元素的异或和为0是存在有效原始数组的充要条件
  3. 边界情况处理:长度为1的特殊情况需要单独考虑

通过数学推导,我们将一个看似复杂的构造问题转化为了一个简单的异或和计算问题,大大降低了解题复杂度。

http://www.xdnf.cn/news/16859.html

相关文章:

  • 前缀和-1314.矩阵区域和-力扣(LeetCode)
  • C# 枚举器和迭代器(常见迭代器模式)
  • VBA代码解决方案第二十七讲:禁用EXCEL工作簿右上角的关闭按钮
  • ubuntu22.04系统入门 linux入门 简单命令基础复习 实现以及实践
  • 经典屏保问题 - 华为OD机试真题(Java 题解)
  • pytorch程序语句固定开销分析
  • dubbo源码之消费端启动的高性能优化方案
  • 28. 找出字符串中第一个匹配项的下标
  • C++-2025.7.31
  • 1️⃣4️⃣ OOP:类、封装、继承、多态
  • H.266 vs H.265/AV1/H.264:从工程落地看下一代视频系统的技术演进
  • 第三十一篇 AI的“能力考”:模型评估、保存与加载的艺术【总结前面3】
  • MBR与GPT分区表深度解析:硬盘分区该怎么选?
  • pip库版本升级
  • Android Studio 中Revert Commit、Undo Commit 和 Drop Commit 使用场景
  • Android Studio怎么显示多排table,打开文件多行显示文件名
  • 现在有哪些广泛使用的时序数据库?
  • [免费]基于Python的招聘职位信息推荐系统(猎聘网数据分析与可视化)(Django+requests库)【论文+源码+SQL脚本】
  • [mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现
  • Web3.0 和 Web2.0 生态系统比较分析:差异在哪里?
  • 【Datawhale AI夏令营】科大讯飞AI大赛(大模型技术)/夏令营:让AI理解列车排期表(Task3)
  • 【python 获取邮箱验证码】模拟登录并获取163邮箱验证码,仅供学习!仅供测试!仅供交流!
  • uni-app webview的message监听不生效(uni.postmessage is not a function)
  • linux 执行sh脚本,提示$‘\r‘: command not found
  • 从一开始的网络攻防(十四):WAF绕过
  • day21-Excel文件解析
  • 【MySQL 数据库】MySQL索引特性(一)磁盘存储定位扇区InnoDB页
  • AI 代码助手在大前端项目中的协作开发模式探索
  • C++ Qt网络编程实战:跨平台TCP调试工具开发
  • 容器与虚拟机的本质差异:从资源隔离到网络存储机制