1、LeetCode——面试题 16.01. 交换数字
思路:不使用其他变量,可以使用加减法或者异或运算(加减法的话需要注意溢出和小减大得到负数的问题)
代码及详情:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
*returnSize = 2;
// 异或运算
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
// 加减法,需要注意溢出问题和小减大的问题
// 以下只是通用模板
// numbers[0] += numbers[1];
// numbers[1] -= numbers[0];
// numbers[0] -= numbers[1];
return numbers;
}
2、LeetCode——面试题 16.01. 交换数字
思路:
- 先将 num 的二进制用一个数组存起来,然后循环交换奇数位和偶数位上的数字,最后将二进制数转换为十进制。
- 将 num 的二进制位上的奇数位向右移一位,偶数位向左移一位,然后对两个结果进行或运算
代码及详情:
int exchangeBits(int num){
// if(num == 0) return num;
// int bit[32] = {0};
// int ans = 0;
// int idx = 0;
// // 先记录下二进制数
// for(idx; idx < 32; idx++){
// bit[idx] = num >> idx & 1;
// if(num >> idx == 0)
// break;
// }
// // 再交换奇偶位的二进制数
// for(int i = 0, j = 1; j <= idx; i += 2, j += 2){
// bit[i] ^= bit[j];
// bit[j] ^= bit[i];
// bit[i] ^= bit[j];
// }
// // 再转换位十进制数
// for(int i = 0, j = 0; i <= idx; i++, j++){
// ans += bit[i] * pow(2,j);
// }
// return ans;
// 奇数位向右移一位,偶数位向左移一位,然后对两个结果进行或运算
int a = 0b10101010101010101010101010101010; //取奇数位
int b = 0b01010101010101010101010101010101; //取偶数位
int x = (num & a) >> 1;
int y = (num & b) << 1;
return x | y;
}
文首图片素材取自博客:《算法零基础100讲》(第16讲) 变量交换算法_英雄哪里出来的博客-CSDN博客