今天来一波位运算题,祝大家刷题愉快!位运算刷刷刷!!!题目大都是简单题。
给出ac的代码与部分分析hh
1. 2的幂
题目:https://leetcode-cn.com/problems/power-of-two/
分析:y总讲过的lowbit,2的幂必然是10000,1000啥的,所以只需要n&-n等于n本身就可以了,返回1000正好是原数1000
代码:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0 && (n&-n)==n;
}
};
2. 4的幂
题目:https://leetcode-cn.com/problems/power-of-four/
分析:显然和上题很类似,怎么样才能满足4的幂呢?
1.必须大于0 n>0
2.满足2的幂 n&-n==n
3.这里涉及数学,可以记住一个知识点:2^(2x) % 3 = 1;2^(2x+1) % 3 = 2;
也就是说2的偶数次幂对3取余数是1,奇数次幂则是2
代码:
class Solution {
public:
bool isPowerOfFour(int n) {
return n>0 && (n&-n)==n && n%3==1;
}
};
3. 位1的个数
题目:https://leetcode-cn.com/problems/number-of-1-bits/
分析:没啥分析的,模板题
code:
class Solution {
public:
int hammingWeight(uint32_t n) {
int res=0;
while(n) n-=n&-n,res++;
return res;
}
};
4.汉明距离
题目:https://leetcode-cn.com/problems/hamming-distance/
分析:读题发现,其实就是把两个数异或之后,然后再套用我们的板子就行了
code:
class Solution {
public:
int hammingDistance(int x, int y) {
int n=x^y;
int res=0;
while(n) n-=n&-n,res++;
return res;
}
};
5.只出现一次的数字
题目:https://leetcode-cn.com/problems/single-number/
分析:一个数组,找出唯一一个不重复的那个数字,这里需要把握异或的性质
相同数字异或必然为0,123^0=123;0^0=0,1^0=1;
所以全部异或一遍本题结束
code:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for (auto x: nums) res ^= x;
return res;
}
};
6.交替位二进制数
题目:https://leetcode-cn.com/problems/binary-number-with-alternating-bits/
分析:本题要明确啥意思,就是说判断相邻两位是否相同
若00,11,则true;
若01,10,则false
假设n=1101,技巧是把这个数&3,就可以了,也就是&11;
&上之后如果是0或者3,那么false,就可以了
n每次完事后>>1;
code:
class Solution {
public:
bool hasAlternatingBits(int n) {
while(n)
{
if((n&3)==0 || (n&3)==3) return false;
n>>=1;
}
return true;
}
};
7. 两整数之和
题目:https://leetcode-cn.com/problems/sum-of-two-integers/
分析:a^b 不进位加法
(a&b)<<1; 进位相加即可
code:
class Solution {
public:
int getSum(int a, int b) {
if(!a) return b;
int sum=a^b,carry=(unsigned)(a&b)<<1;
return getSum(carry,sum);
}
};
8. 面试题 16.01. 交换数字
题目:https://leetcode-cn.com/problems/swap-numbers-lcci/
分析:这题有点曰
算法是
a=a^b;
b=a^b;
a=a^b;
因为b=a^b=a^b^b=a;
a=a^b=a^a^b=b;
英雄哥解法有点sao哈哈
code:
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
numbers[0]=numbers[0]^numbers[1];
numbers[1]=numbers[0]^numbers[1];
numbers[0]=numbers[0]^numbers[1];
return numbers;
}
};
9. 插入
题目:https://leetcode-cn.com/problems/insert-into-bits-lcci/
分析:这题简单吗?题目费半天劲
看图
首先先把j到i之间的数变成0,然后把M左移i位,然后与M或运算就好了,先删除记忆,在重置记忆
如上述例子
1<<k位后,变0000000100,再取反变成11111110111,在和N进行或运算;
然后把M左移i位,在和N进行|运算,完事
code:
class Solution {
public:
int insertBits(int N, int M, int i, int j) {
int k;
for(int k=i;k<=j;k++)
{
N&=~((long long)1<<k);
}
return N|(M<<i);
}
};