当前位置:首页 > 力扣 > 力扣面试题 16.01 :用异或操作玩转两数交换

力扣面试题 16.01 :用异或操作玩转两数交换

10个月前 (05-18)


力扣面试题 16.01 :用异或操作玩转两数交换 力扣 面试题 异或 算法 第1张给定一个长度为 2 的整数数组 numbers,要求在不使用额外内存空间(即不使用临时变量)的情况下,交换数组中的两个元素并返回。题目考验对位运算的理解与应用,需通过巧妙的异或操作实现两数值的高效交换,而非依赖传统中间变量方法。



思路与过程

通过三次异或(XOR)操作完成两数交换,核心逻辑是基于异或运算的以下特性:

1.自反性‌:a ^ a = 0

2‌.恒等性‌:a ^ 0 = a

3.交换律与结合律‌:a ^ b = b ^ a(a ^ b) ^ c = a ^ (b ^ c)

具体步骤如下:

1.第一步‌:将 numbers[0] 赋值为 numbers[0] ^ numbers[1],此时 numbers[0] 存储了两数的“叠加”信息。

2.第二步‌:将 numbers[1] 赋值为当前 numbers[0](即叠加后的值)与原始 numbers[1] 异或,此时 numbers[1] 还原为原始 numbers[0] 的值。

3.第三步‌:将 numbers[0] 再次与当前 numbers[1](即原始 numbers[0])异或,此时 numbers[0] 还原为原始 numbers[1] 的值。

整个过程未使用临时变量,仅通过三次异或操作完成交换,时间复杂度 O(1),空间复杂度 O(1)。


代码:

class Solution {  
public:  
    vector<int> swapNumbers(vector<int>& numbers) {  
        // 三步异或交换法  
        numbers[0] = numbers[0] ^ numbers[1];  // 将两个数的异或结果暂存到 numbers[0]  
        numbers[1] = numbers[0] ^ numbers[1];  // 用叠加结果异或 numbers[1],得到原始 numbers[0] 并赋给 numbers[1]  
        numbers[0] = numbers[0] ^ numbers[1];  // 用叠加结果异或新的 numbers[1],得到原始 numbers[1] 并赋给 numbers[0]  
        return numbers;  
    }  
};



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

力扣765题:情侣牵手问题的贪心解法

力扣765题:情侣牵手问题的贪心解法

一、题目解读力扣765题要求在一个座位数组中,每对情侣需相邻而坐。给定n对情侣的初始座位安排(偶数长度数组),需通过最小次数的交换操作,使所有情侣成为相邻座位。二、贪心算法完整代码class ...

力扣面试08.11题解析:动态规划解决零钱兑换问题(附完整代码与优化思路)

力扣面试08.11题解析:动态规划解决零钱兑换问题(附完整代码与优化思路)

一、题目解读力扣面试08.11题要求计算给定金额n的零钱兑换方案总数,可使用指定面额的硬币(如1、5、10、25),每种硬币无数量限制。需输出总方案数对10^9+7取模的结果。题目核心在于组合计数,需...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。