目录
- 一、概念
- 二、模板
- 三、例题
- 题:面试题 16.01. 交换数字
- 解:
- 题:面试题 05.07. 配对交换
- 解:
内容摘自英雄哥,详情请看英雄哥,以下是java版
一、概念
变量交换
二、模板
编写一个函数,不用临时变量,直接交换 a 与 b 的值 。
void swap(int a, int b){
a = a + b;
b = a - b;
a = a - b;
}
三、例题
题:面试题 16.01. 交换数字
编写一个函数,不用临时变量,直接交换numbers = [a, b]中a与b的值。
示例:
输入: numbers = [1,2]
输出: [2,1]
提示:
numbers.length == 2
-2147483647 <= numbers[i] <= 2147483647
解:
解题思路:暴力
AC代码:
class Solution {
public int[] swapNumbers(int[] numbers) {
return new int[]{numbers[1], numbers[0]};
}
}
解题思路:模板
AC代码:
class Solution {
public int[] swapNumbers(int[] numbers) {
numbers[0] = numbers[0] + numbers[1];
numbers[1] = numbers[0] - numbers[1];
numbers[0] = numbers[0] - numbers[1];
return numbers;
}
}
解题思路:位运算
AC代码:
class Solution {
public int[] swapNumbers(int[] numbers) {
numbers[0] = numbers[0] ^ numbers[1];
numbers[1] = numbers[0] ^ numbers[1];
numbers[0] = numbers[0] ^ numbers[1];
return numbers;
}
}
题:面试题 05.07. 配对交换
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例1:
输入:num = 2(或者0b10)
输出 1 (或者 0b01)
示例2:
输入:num = 3
输出:3
提示:
num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。
解:
解题思路: num是int范围内的数:
- 0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)
- 0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)
将奇偶拆开移动再合并
AC代码:
class Solution {
public int exchangeBits(int num) {
int odd = num & 0x55555555; // 保留奇数
int even = num & 0xaaaaaaaa; // 保留偶数
odd <<= 1; // 奇数左移
even >>>= 1; // 偶数右移
return odd | even; // 合并奇偶
}
}