当前位置: 首页 > 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.lryc.cn/news/605923.html

相关文章:

  • 《Java 程序设计》第 16 章 - JDBC 数据库编程
  • rabbitmq的安装和使用-windows版本
  • MFC CChartCtrl编程
  • Python爬虫07_Requests爬取图片
  • 【Java23种设计模式】:模板方法模式
  • 【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
  • PostgreSQL面试题及详细答案120道(01-20)
  • 前端方案设计:实现接口缓存
  • 什么是网络安全?网络安全包括哪几个方面?学完能做一名黑客吗?
  • 网络与信息安全有哪些岗位:(4)应急响应工程师
  • Amazon RDS for MySQL成本优化:RDS缓存降本实战
  • 前缀和-1314.矩阵区域和-力扣(LeetCode)
  • 隐私灯是否“可信”?基于驱动层的摄像头指示机制探析
  • 【1】数据可视化分析方法
  • 20250731在荣品的PRO-RK3566开发板的Android13下跑通敦泰的FT8206触控芯片
  • Google政策大更新:影响金融,Ai应用,社交,新闻等所有类别App
  • 新手教程:用外部 PostgreSQL 和 Zookeeper 启动 Dolphinscheduler
  • 25.(vue3.x+vite)两个pinia如何互相调用
  • Docker 初学者需要了解的几个知识点 (七):php.ini
  • LoggerFactory(日志门面框架核心工厂类)详解
  • 【C#设计模式】深入理解常见迭代器模式(Iterator Pattern)
  • 安装 docker compose v2版 笔记250731
  • docker离线安装mysql镜像
  • 内存网格、KV存储和Redis的概念、使用场景及异同
  • 分布式锁ZK与redis
  • Redis 存在哪些问题
  • 【问题】Docker 容器内的应用(如n8n),访问不到外部主机的应用(如mysql)
  • 【单片机】【分布式】从单机到分布式:Redis如何成为架构升级的关键力量
  • react调用接口渲染数据时,这些表格里的数据是被禁选的
  • 【Unity笔记04】数据持久化