本文是《算法零基础100讲》(第16讲) 变量交换算法中所涉及课后习题的解答,发帖来记录自己关于这些题的理解和做题过程中思路,如果有错误,欢迎批评指正。
1.交换两个数
题目:给定一个包含两个整数的数组,在不使用额外变量的情况下将他们交换。
举例:
numbers=[2,3] ==> numbers=[3,2]
主要思路:
对a和b,首先计算a+b赋给a,此时a变为了初始的a和b两数的和,b依然是初始的b,然后令b=a-b=a+b-b=a,此时b变为了初始的a,最后令a=a-b=a+b-a=b,即a变为了初始的b,从而完成了交换。
代码:
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
numbers[0]=(long long)numbers[0]+numbers[1];
numbers[1]=(long long)numbers[0]-numbers[1];
numbers[0]=(long long)numbers[0]-numbers[1];
return numbers;
}
};
2.配对交换
题目:
给定一个整数,将它们的奇偶位进行交换。
举例:
2 : 0b10 ==> 1 : 0b01
主要思路:
对一个数,要交换其奇偶为的位,首先使用按位与运算将奇偶位都提取出来,然后将偶数为左移,奇数位右移,最后将二者进行按位或运算,即完成了奇偶位的交换。
代码:
class Solution {
public:
int exchangeBits(int num) {
int even=0x55555555;
int odd=0xaaaaaaaa;
int evenBit=num&even;
int oddBit=num&odd;
return oddBit>>1 | evenBit<<1;
}
};