力扣面试题 16.01 :用异或操作玩转两数交换
给定一个长度为 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; } };
原创内容 转载请注明出处