面试题 05.07. 配对交换

本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出


题目描述

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例1:

 输入:num = 2(或者0b10)
 输出 1 (或者 0b01)

示例2:

 输入:num = 3
 输出:3

提示:

  • num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。
题目链接
题目分析

我的思路是先分析题目中数字的范围,最大为32位,所以我只需要枚举每一位,之后两两交换每一位,得到最终的解就好了,偏向于模拟的写法,拿一个数字来举例,例如给定数字6,首先6的二进制表示缩减为0110,之后相应的求解过程如下:

0110

假设res = 0
首先分析第一组10,此时这里原本的计算为0*2^0+1*2^1
现在我们只需要将它颠倒,变成1*2^0+0*2^1即可,然后将这个新的计算结果累加到结果集中,
也就是此时res = 1

之后看第二组01,此时这里原本的计算为1*2^2+0^2^3
现在我们将它颠倒,变成1*2^3+0*2^2,将这个结果放到结果集中,此时res = 9
也就求出了我们要的结果

那么第二种解法偏向于数学方面,它是利用了0xaaaaaaaa以及0x55555555这两个数字,首先看每一个a和每一个5,发现a的二进制表示为1010,而50101,故如果我们让num & 0xaaaaaaaa就可以获得该数字的所有奇数位,而num & 0x55555555就可以获得该数字的所有偶数位,之后我们让偶数位的数字右移一位,奇数位的数字左移一位,这两个数字或起来就是最终的解

解题代码
解法一

Python

class Solution:
    def exchangeBits(self, num: int) -> int:
        res = 0
        for i in range(0, 32, 2):
            even = num>>i&1
            odd = (num>>i+1)&1
            res += even*pow(2, i+1) + odd*pow(2, i)
        return res

Java

class Solution {
    public int exchangeBits(int num) {
        int res = 0;
        for(int i=0; i<32; i+=2){
            int even = num>>i&1;
            int odd = (num>>i+1)&1;
            res += even*Math.pow(2, i+1) + odd*Math.pow(2, i);
        }
        return res;
    }
}

解法二

Python

class Solution:
    def exchangeBits(self, num: int) -> int:
        a, b = num&0xaaaaaaaa, num&0x55555555
        a >>= 1
        b <<= 1
        return a | b

Java

class Solution {
    public int exchangeBits(int num) {
        int a = num & 0xaaaaaaaa;
        int b = num & 0x55555555;
        a >>= 1; b <<= 1;
        return a | b;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值