1. 题目解析与常规解法
这道面试题要求我们编写一个函数,在不使用临时变量的情况下交换数组中的两个数字。我们先来看题目给出的示例:
输入: numbers = [1,2]
输出: [2,1]
1.1 常规交换方法的问题
大多数程序员首先想到的交换两个变量的方法是使用临时变量:
cpp复制void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
这种方法简单直观,但题目明确要求不能使用临时变量。这就迫使我们寻找其他解决方案。
1.2 算术运算交换法
不使用临时变量的常见方法是通过加减法实现交换:
cpp复制a = a + b;
b = a - b; // 此时b等于原来的a
a = a - b; // 此时a等于原来的b
这种方法虽然可行,但存在整数溢出的风险。当a和b的值很大时,a+b可能会超出整型变量的最大值,导致计算结果错误。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 异或运算解法详解
2.1 异或运算的基本性质
异或运算(XOR)有几个重要性质:
- 任何数与自己异或结果为0:a ^ a = 0
- 任何数与0异或结果不变:a ^ 0 = a
- 满足交换律和结合律:a ^ b = b ^ a, (a ^ b) ^ c = a ^ (b ^ c)
2.2 异或交换的原理
基于这些性质,我们可以推导出交换算法:
- a = a ^ b
- b = b ^ a = b ^ (a ^ b) = a
- a = a ^ b = (a ^ b) ^ a = b
这样就在不使用临时变量的情况下完成了交换。
2.3 代码实现解析
让我们详细分析题目给出的代码:
cpp复制class Solution {
public:
vector<int> swapNumbers(vector<int>& a) {
a[0] = a[0] ^ a[1]; // 步骤1
a[1] = a[1] ^ a[0]; // 步骤2
a[0] = a[0] ^ a[1]; // 步骤3
return a;
}
};
每一
