变量交换算法(临时变量法,加减法,异或法) 例题:面试题16.01.交换数字 面试题05.07 配对交换

劳逸结合,解一点简单的题目,秣马厉兵再出发

算法描述:交换两个变量的值

例题一:

方法1️⃣:临时变量法(无视力扣的劝告ing)

class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
    int tmp=numbers.back();
    numbers.back()=numbers.front();
    numbers.front()=tmp;
    return numbers;
    }
};

方法2️⃣:异或运算符法

核心原理:

一个数异或本身,再异或另一个数,将获得那另一个数的值

设x,y为两整数,则y==x^x^y;      (根据异或的定义,即可简单地数学证明)

class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
   numbers.back()^=numbers.front();//相当于,x赋x^y的值
   numbers.front()^=numbers.back();//相当于,y赋值y^x^y的值(异或具有交换律)
   numbers.back()^=numbers.front();//相当于,x^y赋x^y^y的值
    return numbers;
    }
};

 方法3️⃣:加减法

class Solution {
public:
typedef long long ll;
    vector<int> swapNumbers(vector<int>& numbers) {
        numbers[0] = (ll)numbers[0] + numbers[1];        //强制转化为long long ,防溢出
        numbers[1] = (ll)numbers[0] - numbers[1];
        numbers[0] = (ll)numbers[0] - numbers[1];
        return numbers;
    }
};

两个数,想怎么欺负就怎么欺负,下面的是不讲理的特殊方法

方法4️⃣:函数法(

class Solution {       //STL是个好伙伴
public:
    vector<int> swapNumbers(vector<int>& numbers) {
    reverse(numbers.begin(),numbers.end());
    return numbers;
    }
};

 方法4️⃣:临时空间法:

class Solution {          //创造临时空间,返回值会代替原数组
public:
    vector<int> swapNumbers(vector<int>& numbers) {
    return {numbers.back(),numbers.front()};
    }
};

例题二:

提醒:这里的配对交换,交换的是二进制位。0b代表二进制

注意:这里num均为非负数,这意味这我们可以放心大胆地使用位运算。 

本题最大的难度在于位运算的理解(原码补码反码要认识)

分析:要实现题目的目的,等效将二进制的奇数位左移,偶数位右移

class Solution {
public:
    int exchangeBits(int num) {
    int ji=num & 0x55555555;     //分别提出num的奇数位,偶数位
    int ou=num & 0xaaaaaaaa;     //提取奇数位就在奇数位置1,一共要统计32个位,二进制表达为 
                               //10101010,同理提取偶数位的二进制表达为01010101
    ji<<=1;                    //二进制太长,转化为十六进制0x
    ou>>=1;                    //1010=2^1+2^3=10=a,0101=2^0+2^2=5;
    return ji+ou;             //将提取出的奇偶位合并即可
    }  
};

不忘初心,放得始终

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0<Solving)1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值