力扣-位运算-1【算法学习day.41】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

tip:下面题目套路类似,就不分析了

1.使两个整数相等的位更改次数

题目链接: 3226. 使两个整数相等的位更改次数 - 力扣(LeetCode)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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)

题面:

代码:

java 复制代码
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);
    // }
}

后言

上面是力扣位运算专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

相关推荐
cv君2 分钟前
【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦
算法
E___V___E11 分钟前
CSAPP学习
学习
Ocean☾14 分钟前
C语言-详细讲解-P1217 [USACO1.5] 回文质数 Prime Palindromes
c语言·数据结构·算法
沐泽Mu17 分钟前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa18 分钟前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
Tony_long748323 分钟前
Python学习——猜拳小游戏
开发语言·python·学习
跳动的梦想家h25 分钟前
黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)
java·开发语言·redis
苹果醋328 分钟前
前端面试之九阴真经
java·运维·spring boot·mysql·nginx
Diamond技术流1 小时前
从0开始学习Linux——环境变量详解
linux·服务器·学习·centos·软件安装·环境变量
ac-er88881 小时前
PHP 二分法查找算法
开发语言·算法·php