基本信息
文件名称:力扣面试题16.01「交换数字」新手教程.docx
文件大小:14.02 KB
总页数:3 页
更新时间:2025-05-31
总字数:约小于1千字
文档摘要
力扣面试题16.01「交换数字」新手教程
题目深度解析
题目要求不使用临时变量交换两个整数的值。
关键点:
1.限制条件?:不能使用临时变量
2.输入输出?:输入是包含两个数字的vector,输出是交换后的vector
3.算法要求?:需要原地修改数组
生活场景类比
假设你有两杯饮料:
杯子A:可乐
杯子B:雪碧
传统方法需要第三个杯子来交换,而题目要求你只能用这两个杯子完成交换
解题步骤详解
1.异或运算特性?:
a^a=0
a^0=a
2.三步交换法?:
第一步:numbers[0]=a^b
第二步:numbers[1]=(a^b)^b=a
第三步:numbers[0]=(a^b)^a=b
注意事项
1.可读性?:虽然高效但不如临时变量直观
2.适用范围?:仅适用于整数交换
完整注释代码
classSolution{
public:
vectorintswapNumbers(vectorintnumbers){
//第一步:numbers[0]存储a和b的异或结果
numbers[0]=numbers[0]^numbers[1];
//第二步:numbers[1]现在等于原始numbers[0]
numbers[1]=numbers[0]^numbers[1];
//第三步:numbers[0]现在等于原始numbers[1]
numbers[0]=numbers[0]^numbers[1];
returnnumbers;
}
};
算法分析
时间复杂度?:O(1)只有三次位运算
空间复杂度?:O(1)没有使用额外空间
优势?:
1.不需要临时变量
2.避免可能的溢出问题
局限性?:
1.可读性较差
2.不适用于所有数据类型
位运算的应用,是面试中考察位运算理解的典型题目。理解这个交换原理有助于深入理解计算机底层运算机制。