目录
传送门
课后习题
397.整数替换
201.数字范围按位与
?最后
传送门
《算法零基础100讲》(第43讲) 位运算 (位与) 进阶_英雄哪里出来-CSDN博客按位与 运算符的进阶内容https://blog.csdn.net/WhereIsHeroFrom/article/details/120875810
课后习题
只写了两题,还都是暴力,位运算的技巧一个没用上(不会用……)
397.整数替换
397. 整数替换https://leetcode-cn.com/problems/integer-replacement/
?题目描述:
给定一个正整数?n ,你可以做如下操作:
如果?n?是偶数,则用?n / 2替换?n 。 如果?n?是奇数,则可以用?n + 1或n - 1替换?n 。 n?变为 1 所需的最小替换次数是多少?
int min(int n,int m){
return n < m ? n : m;
}
int dfs(long n){
if(n == 1)
return 0;
if(!(n & 1))
return 1+dfs(n>>1);
else
return 1+min(dfs(n-1),dfs((long)(n+1)));
}
int integerReplacement(int n){
return dfs(n*1L);
}
看别人代码位运算用的太巧了!!!
201.数字范围按位与
201. 数字范围按位与
题目描述:
给你两个整数?left ?和?right ?,表示区间?[left, right] ?,返回此区间内所有数字?按位与?的结果(包含?left ?、right ?端点)。
思路:理解不了他们那灵活的位运算,自己就只能按题目意思一个个的位与了。不过直接挨个位与最终会超时。其实大部分结果都是0的,所有判断如果中间的结果为0就可以提前退出了
int rangeBitwiseAnd(int left, int right){
int ans = left;
long i;
for(i=(long)left+1;i<=right;++i){
if(ans == 0)
return 0; // 一个个挨个位与 如果为0则直接返回
else
ans &= i;
}
return ans;
}
?最后
害,位运算得多补补!!!
|