第十七天 2021-3-25每日刷四题
刷题模块:位运算 - 简单难度
一、【题】2的幂
1000000 & (1000000-1)
=1000000 & (0111111)
=0000000
本质上,n & (n-1) 将二进制中最右边的1变为0
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0) return false;
return !(n &(n-1));
}
};
官方解法:x & (-x)
x & (-x) 可以获取到二进制中最右边的 1,且其它位设置为 0。
原理涉及到负数在计算机中是以补码保存
// 该代码并不能通过leetcode测试,测试案例为1竟然输出为false
// 但是在本地VS编译器上是没有问题的
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0) return false;
return ( n & (-n) == n);
}
};
二、【题】丢失的数字
高斯大法好,使用0-n求和减去数组总和,得到的数字为缺少的数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int sum=0;
for(int i=0;i<n;i++) sum+=nums[i];
int total=(n+1)*n/2;
return total-sum;
}
};
参考C++ 算法篇 位运算得到的
时间复杂度为O(n),没有使用额外空间的解法
异或法
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
for(int i=1;i<n;i++) nums[0]^=nums[i];
for(int i=0;i<=n;i++) nums[0]^=i;
return nums[0];
}
};
三、【题】4的幂
参考了官方题解
想要判断某位上是否为一,可以通过将数字和预设该位(例如0x55555555)的数字相与来实现
class Solution {
public:
bool isPowerOfFour(int n) {
if(n<=0) return false;
return !(n & (n-1)) && (n & 0x55555555);
}
};
四、【题】找不同
简单
使用编译器测试了char字符在位运算的时候的表现
char本质还是根据ASCII存储的int值,与int无区别,只不过在cout时根据其属于char还是int表现成不同的样式,其两种状态可以互相转换。
class Solution {
public:
char findTheDifference(string s, string t) {
int n=t.size();
for(int i=1;i<n;i++) t.at(0)^=t.at(i);
for(int i=0;i<n-1;i++) t.at(0)^=s.at(i);
return t.at(0);
}
};
1175

被折叠的 条评论
为什么被折叠?



