前言
###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!
习题
1.每个查询的最大异或值
题目链接: 1829. 每个查询的最大异或值 - 力扣(LeetCode)
题面:
代码:
java
class Solution {
public int[] getMaximumXor(int[] nums, int maximumBit) {
int n = nums.length;
// maximumBit = (int)Math.pow(2,maximumBit);
int flag = nums[0];
for(int i = 1;i<n;i++){
flag^=nums[i];
}
int[] ans = new int[n];
int count = n;
int maxindex;
int max;
int u = (1<<(maximumBit))-1;
for(int i = 0;i<n;i++){
ans[i] = (flag)^u;
flag^=nums[count-1];
count--;
}
return ans;
}
}
2.使数组异或和等于K的最少操作次数
题目链接: 2997. 使数组异或和等于 K 的最少操作次数 - 力扣(LeetCode)
题面:
代码:
java
class Solution {
public int minOperations(int[] nums, int k) {
int n = nums.length;
for(int i = 0;i<n;i++){
k^=nums[i];
}
int ans = 0;
return Integer.bitCount(k);
}
}
3.形成两个异或相等数组的三元组数目
题目链接: 1442. 形成两个异或相等数组的三元组数目 - 力扣(LeetCode)
题面:
代码:
java
class Solution {
public int countTriplets(int[] arr) {
int n = arr.length;
for(int i = 1;i<n;i++){
arr[i]^=arr[i-1];
}
int ans = 0;
int a;
int b;
for(int i = 0;i<n-1;i++){
for(int j=i+1;j<n;j++){
for(int k = j;k<n;k++){
if(i==0){
a = arr[j-1];
}else{
a = arr[j-1]^arr[i-1];
}
b = arr[k]^arr[j-1];
if(a==b)ans++;
}
}
}
return ans;
}
}
4.最小异或
题目链接: 2429. 最小异或 - 力扣(LeetCode)
题面:
代码:
java
class Solution {
public int minimizeXor(int num1, int num2) {
int oneBitNum2 = Integer.bitCount(num2);
int lenNum1 = (int)(Math.log(num1)/Math.log(2))+1;
int flag = (1<<lenNum1)-1;
int ans = flag&num1;
int oneBitAns = Integer.bitCount(ans);
if(oneBitAns==oneBitNum2)return ans;
else if(oneBitAns>oneBitNum2){
for(int i = 0;i<(oneBitAns-oneBitNum2);i++){
ans-=(ans&(-ans));
}
}
else{
int bit = 1;
for(int i = 0;i<(oneBitNum2-oneBitAns);i++){
while(Integer.bitCount(ans)>=Integer.bitCount(ans+bit)){
bit*=2;
}
ans+=bit;
}
}
return ans;
}
}
后言
上面是力扣位运算专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!