前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
tip:下面题目套路类似,就不分析了
1.使两个整数相等的位更改次数
题目链接:3226. 使两个整数相等的位更改次数 - 力扣(LeetCode)
题面:
代码:
class Solution {public int minChanges(int n, int k) {if(n==k)return 0;if(n<k)return -1;int ans = 0;while(n>0){if((n&1)==1&&(k&1)==0){ans++;}else if((n&1)==0&&(k&1)==1){return -1; }n>>=1;k>>=1;// if(max>0&&min==0)return -1;}return ans;}
}
2.根据数字二进制下1的数目排序
题目链接:1356. 根据数字二进制下 1 的数目排序 - 力扣(LeetCode)
题面:
代码:
class Solution {public int[] sortByBits(int[] arr) {int n = arr.length;for(int i = 0;i<n-1;i++){for(int j = i+1;j<n;j++){if(getOneNumber(arr[i])>getOneNumber(arr[j])){swap(arr,i,j);}else if(getOneNumber(arr[i])==getOneNumber(arr[j])&&arr[i]>arr[j]){swap(arr,i,j);}}} return arr;}public int getOneNumber(int n){int ans = 0;while(n>0){if((n&1)==1){ans++;}n>>=1;}return ans;}public void swap(int[] arr,int i,int j){int flag = arr[i];arr[i] = arr[j];arr[j] = flag;}
}
3.汉明距离
题目链接:461. 汉明距离 - 力扣(LeetCode)
题面:
代码:
class Solution {public int hammingDistance(int x, int y) {int ans = 0;while(x>0||y>0){if((x&1)!=(y&1)){ans++;}x>>=1;y>>=1;}return ans;}
}
4.转换数字的最少位翻转次数
题目链接:2220. 转换数字的最少位翻转次数 - 力扣(LeetCode)
题面:
代码:
class Solution {public int minBitFlips(int start, int goal) {int ans = 0;for(int i = start^goal;i>0;i-=lowbit(i))ans++;return ans;}public int lowbit(int n){return n&(-n);}
}
5.数字的补数
题目链接:476. 数字的补数 - 力扣(LeetCode)
题面:
代码:
class Solution {public int findComplement(int num) {int flag = 0;int flag2 = num;while(num>0){flag<<=1;flag+=1;num>>=1;}return flag^flag2;}
}
6.十进制整数的反码
题目链接:1009. 十进制整数的反码 - 力扣(LeetCode)
题面:
代码:
class Solution {public int bitwiseComplement(int n) {if(n==0)return 1;int flag = n;int flag2 = 0;while(n>0){flag2<<=1;flag2+=1;n>>=1;}return flag^flag2;}
}
7.二进制间距
题目链接:868. 二进制间距 - 力扣(LeetCode)
题面:
代码:
class Solution {public int binaryGap(int n) {int max = 0;int[] arr = new int[40];int count = 0;for(int i = n;i>0;i-=lowbit(i)){int flag = lowbit(i);arr[count++] = (int)(Math.log(flag)/Math.log(2))+1;}for(int i = 1;i<count;i++){max = Math.max(max,arr[i]-arr[i-1]);}return max;}public int lowbit(int n){return n&(-n);}
}
8.生成不含相邻零的二进制字符串
题目链接:3211. 生成不含相邻零的二进制字符串 - 力扣(LeetCode)
题面:
代码:
class Solution {List<String> ans = new ArrayList<>();int n;public List<String> validStrings(int n) {this.n = n;recursion(1,"",0);return ans;}public void recursion(int t,String str,int flag){if(t==n+1){ans.add(str);return;}if(t==1||flag==1){recursion(t+1,str+"0",0);recursion(t+1,str+"1",1);}else if(flag==0){recursion(t+1,str+"1",1);}}
}
9.找出数组中的K-or值
题目链接:2917. 找出数组中的 K-or 值 - 力扣(LeetCode)
题面:
代码:
class Solution {public int findKOr(int[] nums, int k) {int n = nums.length;int ans = 0;for (int i = 0; i < 31; i++) {int sum = 0;for (int j = 0; j < n; j++) {sum+=(nums[j] & 1);nums[j] >>= 1;} if(sum>=k){ans |= 1 << i; }}return ans;}
}
10.交替位二进制数
题目链接:693. 交替位二进制数 - 力扣(LeetCode)
题面:
代码:
class Solution {public boolean hasAlternatingBits(int n) {int len = (int)(Math.log(n)/Math.log(2))+1;int flag = n&1;n>>=1;for(int i = 1;i<len;i++){int lin = n&1;if(lin==flag)return false;flag = lin;n>>=1;}return true;}
}
11.找到两个数组的前缀公共数组
题目链接:2657. 找到两个数组的前缀公共数组 - 力扣(LeetCode)
题面:
代码:
class Solution {public int[] findThePrefixCommonArray(int[] A, int[] B) {int n = A.length;int[] ans = new int[n];long flaga = 0;long flagb = 0;for(int i = 0;i<n;i++){int a = A[i];int b = B[i];flaga|=(1L<<(a-1));flagb|=(1L<<(b-1));long lin = (flaga&flagb);ans[i] = Long.bitCount(lin);}return ans;}// public long lowbit(long n){// return n&(-n);// }
}
后言
上面是力扣位运算专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!