0
点赞
收藏
分享

微信扫一扫

《算法基础》变量交换算法

酷子腿长一米八 2022-03-19 阅读 19

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. 交换数字

 思路:

  1. 先将 num 的二进制用一个数组存起来,然后循环交换奇数位和偶数位上的数字,最后将二进制数转换为十进制。
  2. 将 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博客 

举报

相关推荐

0 条评论