千人万题计划16讲打卡(力扣面试题 16.01. 交换数字)
题目描述
题目:编写一个函数,不用临时变量,直接交换numbers = [a, b]
中a
与b
的值。
两种思路处理该题
-
解法一:算数加减法
注意点:越界问题的出现
解题思路描述:两个整数分别时a,b
不引入第三个数的表达式:
a = a+b;
b = a-b;
a = a-b;
引入c讲解:
a = a + b; => c = a+b;
b = a - b; => b = c - b = a + b - b = a;
a = a - b; => a = c - b = a + b - a = b;
下面式实现代码
int* swapNumbers(int* number, int numbersSize, int* returnSize){ //这个判断条件是用来防止越界的 两个负数相加会越界,两个正数相加也会越界 if ((number[0]>0 && number[1]>0)||number[0]<0&&number[1]<0) { number[0] = -number[0]; number[0] = number[0]+number[1]; number[1] = -(number[0]-number[1]); number[0] = number[0]+number[1]; }else{ number[0] = number[0]+number[1]; number[1] = number[0]-number[1]; number[0] = number[0]-number[1]; } *returnSize = 2; return number; }
2.解法二: 应用异或操作的规律(异或运算: 相同为0,不同为1)
整数的异或操作:将两个数的二进制按位异或操作,详解
int a = 8;
int b = 2;
a^b = 10;
// 运算步骤
// a 的二进制 1000
// b 的二进制 10
// a^b = 1000^0010
// 按位异或后 1010 转换为十进制 10
(1)// a^b^a = 1000^0010^1000 = 1010^1000 = 0010 = b
(2)// a^b^b = 1000^0010^0010 = 1010^0010 = 1000 = a
按上面(1)(2) 的推论可得解发法如下:
int* swapNumbers(int* number, int numbersSize, int* returnSize){
number[0] = number[0]^number[1];
number[1] = number[0]^number[1];
number[0] = number[0]^number[1];
*returnSize = 2;
return number;
}