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

【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.dtcms.com/a/308600.html

相关文章:

  • 五、cv::SparseMat的介绍和使用
  • 是采用示例模板,还是采用json的结构化数据,哪种方式会让llm的输出更加稳定?
  • 查询目前服务器所占的带宽的命令(上传和下载)
  • CNN卷积神经网络之LeNet和AlexNet经典网络模型(三)
  • c语言的编译链接
  • Winform PathGradientBrush类使用
  • C#程序本地运行正常,通过网络下载报错:FileLoadException:“未能加载文件或程序集“xxx.dll”或它的某一个依赖项。
  • 【pycharm的使用】
  • Qwen3-30B-A3B-Thinking-2507 推理模型深度评测
  • 250721脑电分析课题进展——手工特征总结
  • lsof命令
  • SSO面临的问题
  • 为什么有时神经元会输出类似(甚至一样)?
  • 行业分享丨从工具应用到体系进化:东风商用车仿真体系建设与实践
  • 【源力觉醒 创作者计划】文心一言与deepseek集成springboot开发哪个更方便
  • 【力扣】面试经典150题总结01-数组/字符串
  • Dev-C++ 6.3 安装与使用指南:适合新手的C/C++编程工具
  • Allegro实用技巧-Snap-命令行移动
  • Android端RTMP低延迟播放器在工业与智能场景下的架构与落地
  • MySQL 中 CHAR 和 VARCHAR 类型有什么区别?
  • 一次性接收大量上传图片,后端优化方式
  • 【Git】Git 实战:完整拉取项目所有分支和标签,切换远程仓库,解决保护分支推送冲突
  • Linux Flathub软件管理方法 使用指南
  • 搭建个人博客
  • 决策树实现回归任务
  • 利用可观测性进行高效故障治理:从预防到改进的完整实践
  • 从Excel到工时管理系统:企业如何选择更高效的工时记录工具?
  • 第二十九章:AI的“原子与批次”:高维数据表示与操作精炼【总结前面(1)】
  • Windows 安全中心是什么?如何关闭 Windows 11 的安全中心
  • 算法导论第三版代码python实现与部分习题答案-第六章:堆排序