劳逸结合,解一点简单的题目,秣马厉兵再出发
算法描述:交换两个变量的值
例题一:
方法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; //将提取出的奇偶位合并即可
}
};
不忘初心,放得始终