【算法】位运算合集

news2024/12/27 8:54:58

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

零:位运算基础公式

零:五道基础题

1:位1的个数

2:比特位计数

3:汉明距离

4:只出现一次的数字|

5:只出现一次的数字|||

一:判定字符是否唯一

1:位图思想总结

2:位图思想和hash表两种方法

二:丢失的数字

三:两整数之和

四:只出现一次的数字||

五:消失的两个数字


 

零:位运算基础公式

69f072b1f40c4f8da1bc5715ce208e54.png

f2ebc62df8b746e4b68259683f3e697d.png

零:五道基础题

1:位1的个数

191. 位1的个数

a57c502ead044c26879b9cb92254cc77.png

class Solution {
    public int hammingWeight(int n) {
        int count = 0;
        while(n != 0){
            n &= (n-1);  //干掉n最右侧的1
            count++;
        }        
        return count;
    }
}

2:比特位计数

338. 比特位计数

022fe6e95f9c4175a40c026ef8ea5492.png

class Solution {
    public int[] countBits(int n) {
        int[] ans = new int[n+1];
        for(int i = 0 ; i <= n ; i++ ){
            int count = 0 , tem = i;
            while(tem != 0){
                tem &= (tem-1);//干掉最右侧的1
                count++;
            }
            ans[i] = count;
        }
        return ans;
        
    }
}

3:汉明距离

461. 汉明距离

f416f02d674e4ea1a386b3b221539b80.png

class Solution {
    public int hammingDistance(int x, int y) {
        int tem = x ^ y;
        int count = 0;
        while(tem != 0){
            tem &= (tem-1);
            count++;
        }
        return count;

    }
}

4:只出现一次的数字|

136. 只出现一次的数字

b14cfd3025944200b422eef05074b9d3.png

class Solution {
    public int singleNumber(int[] nums) {
        int ret = nums[0];
        for(int i = 1 ; i < nums.length ; i++){
            ret ^= nums[i];    
        }
        return ret;

    }
}

5:只出现一次的数字|||

260. 只出现一次的数字 III

用位上数字不同进行分组

7ff400c936654a1988e560da5ba2cfd9.png

class Solution {
    public int[] singleNumber(int[] nums) {
        int ret = 0;
        for(int x : nums){
            ret ^= x; 
        }

        int sign = ret & (-ret);
        int firNum = 0;
        int secNum = 0;
        for(int x : nums){
            if((sign & x) == 0){
                firNum ^= x;
            }else{
                secNum ^= x;
            }
        }
        int[] result = new int[2];
        result[0] = firNum;
        result[1] = secNum;
        return result;

    }
}

 

一:判定字符是否唯一

面试题 01.01. 判定字符是否唯一

1:位图思想总结

9510a6965e064df199f612dcdb349959.png

c217580a605d4f00820c4a085f303bc8.png

2:位图思想和hash表两种方法

709f1da6ac0146a89799edf98757f667.png

class Solution {
    public boolean isUnique(String astr) {
        //鸽巢原理优化
        if(astr.length() > 26){
            return false;
        }
         //位图原理
         char[] str = astr.toCharArray();
         int bitMap = 0;
         for(int x : str){
            int move = x - 'a';
            if((bitMap & (1 << move)) == 0){
                //bitMap&0001000只有非0或者0两个结果 
                //说明当前bitMap位是0,那就添加进去
                bitMap |= (1 << move);
            }else{
                return false;
            }
         }
         return true;
    }
}

//1:把字符串转化为字符数组
        // char[] str = astr.toCharArray();
        // //2:把字符扔到hash表中
        // Map<Character,Integer> hash = new HashMap<>();
        // for(char x : str){
        //     //获取hash表中x的value值
        //     int num = hash.getOrDefault(x,0);
        //     if(num == 0){
        //         hash.put(x,hash.getOrDefault(x,0)+1);
        //     }else{
        //         return false;
        //     }
        // }
        // return true;

二:丢失的数字

268. 丢失的数字

02e3fb40948d445b8a6f0ac6e8eb22a3.png

class Solution {
    public int missingNumber(int[] nums) {
       //高斯求和
       int len = nums.length;
       int sum1 = 0;
       for(int i = 0 ; i < len ; i++){
            sum1 += nums[i];
       }
       int sum2 = (0+len)*(len+1)/2;
       int ret = sum2 - sum1;
       return ret;
    }
}

        // hash数组
        // int len = nums.length;
        // int[] hash = new int[len+1];
        // for(int i = 0 ; i < len ; i++){
        //     hash[nums[i]] = 1;
        // }
        // int ret = 0;
        // for(int i = 0 ; i < len+1 ; i++){
        //     if(hash[i] == 0){
        //         ret = i;
        //     }else{

        //     }
        // }
        // return ret;




        // 异或运算方法
        // int len = nums.length;
        // int[] arr = new int[2*len+1];
        // for(int i = 0 ; i < len ; i++){
        //     arr[i] = nums[i];
        // }
        // int count = 0;        
        // for(int i = len ; i < (2*len+1) ; i++){//i作为添加元素的下标
        //     arr[i] = count;
        //     count++;
        // }
        // int ret = 0;
        // for(int x : arr){
        //     ret ^= x;
        // }
        // return ret;

三:两整数之和

371. 两整数之和

耍赖:直接return;正规军:异或运算无进位相加

2fa4ca506d5f4ffc8f7d101d67af4ae0.png

class Solution {
    public int getSum(int a, int b) {
        while(b != 0){
            int ret = a ^ b;//结果
            int x = (a & b)<<1;
            a = ret;
            b = x;
        }
        return a;
    }
}

        // return a + b;

四:只出现一次的数字||

137. 只出现一次的数字 II - 力扣(LeetCode)

2f60314acc204151886f1e4953ee1ae0.png

65f151292718402c96b5c78c540f0de5.png

class Solution {
    public int singleNumber(int[] nums) {
        //这一层for循环i作为比特位
        int ret = 0;
        for(int j = 0 ; j < 32 ; j++){
            //所有元素的该bit位相加
            int sum = 0;
            for(int i = 0 ; i < nums.length ; i++){
                sum += (nums[i]>>j)&1;
            }
            int tem = sum % 3;
            if(tem == 1){
                ret |= (1<<j);
            }else{
                ret &= ~(1<<j);
            }
        }
        return ret;

    }
}

五:消失的两个数字

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

b730107c48e64e1590f8c7fc36fac49d.png

class Solution {
    public int[] missingTwo(int[] nums) {
        //创建tem数组用来存放nums数组中的元素和1~N数字
        int len = nums.length;
        int n = len + 2;
        int[] tem = new int[2*len+2];
        //处理nums数组
        int ret = 0;
        for(int i = 0 ; i < nums.length ; i++){
            ret ^= nums[i];
            tem[i] = nums[i];
        }
        //处理1~N
        for(int i = 1 ; i <= n ; i++){
            ret ^= i;
            tem[len-1+i] = i;
        }
        int sign = 0;
        while(ret != 0){
            if( ((ret >> sign) & 1) == 1){
                break;
            }else{
                sign++;
            }
        }
        
        //基于sign把数组分成两组
        int[] result = new int[2];
        for(int x : tem){
            if(((x >> sign) & 1) == 1){
                result[0] ^= x;
            }else{
                result[1] ^= x;
            }
        }

        return result;


    
    }
}
class Solution {
    //穷举法
    public int[] missingTwo(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length;
        int[] ret = new int[2];
        int j = 0;
        for(int i = 0 ; i < nums.length-1 ; i++){
            int tem = nums[i+1] - nums[i];
            if(tem == 2){
                ret[j++] = nums[i]+1;
            }else if(tem == 3){
                ret[j++] = nums[i]+1;
                ret[j] = nums[i]+2;
            }
        }
        
        if(nums[0] != 1){
            if(ret[0] == 0){
            ret[0] = 1;
                if(len == 1){
                    if(nums[0]-1 > 1){
                        ret[1] = 2;
                    }else{
                        ret[1] = 3;
                    }
                }else{
                    ret[1] = nums[len-1]+1;
                }
            
            }else{
                if(ret[1] == 0){
                ret[1] = 1;
                }else{

                }
            }
        }else{
            if(ret[0] == 0){
                ret[0] = nums[len-1]+1;
                ret[1] = nums[len-1]+2;
            }else{
                if(ret[1] == 0){
                    ret[1] = nums[len-1]+1; 
                }else{

                }
            }
        }
        return ret;

    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2253417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势&#xff1f; 重要性&#xff1a;⭐⭐⭐ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练…

《Vue零基础教程》(5)计算属性和侦听器好讲解

1 计算属性 1) 什么是计算属性 计算属性就是基于现有属性计算后的属性 2) 计算属性的作用 计算属性用于对原始数据的再次加工 3) 案例 需求 实现如下效果 使用表达式实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF…

Narya.ai正在寻找iOS工程师!#Mixlab内推

如果你对AI技术和iOS开发充满热情&#xff0c;这里有一个绝佳的机会加入一家专注于AI应用创新的初创公司。Narya.ai正在招聘iOS工程师&#xff0c;帮助他们开发下一代效率工具&#xff0c;旨在提升用户的日常生活效率与幸福感。 关于Narya.ai&#xff1a; 专注于AI应用层创新&a…

【开源免费】基于SpringBoot+Vue.JS课程答疑系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 070 &#xff0c;文末自助获取源码 \color{red}{T070&#xff0c;文末自助获取源码} T070&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

FPGA实战篇(触摸按键控制LED灯)

1.触摸按键简介 触摸按键主要可分为四大类&#xff1a;电阻式、电容式、红外感应式以及表面声波式。根据其属性的不同&#xff0c;每种触摸按键都有其合适的使用领域。 电阻式触摸按键由多块导电薄膜按照按键的位置印制而成&#xff0c;但由于耐用性较差且维护复杂&#xff0c…

VSCode如何关闭Vite项目本地自启动

某些情况下VSCode打开Vite项目不需要自动启动&#xff0c;那么如何关闭该功能 文件>首选项>设置 搜索vite 将Vite:Auto Start 勾选取消即可

重生之我在异世界学编程之C语言:深入指针篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文&#xff08;1&#xff09;内置数…

TypeScript (一)运行环境配置,数据类型,可选类型,联合类型,type与interface,交叉类型,断言as,字面量类型,类型缩小

文章目录 一、认识TS1.1 JS 存在的问题1.2 TS的出现1.3 TS运行环境运行ts的三种方式 1.4 变量声明1.5 类型推断 二、数据类型2.1 JS数据类型(1) 数组Array(2) 对象Object(3) 其他类型 2.2 TS特有数据类型(1) any类型(2) unknown类型(3) void类型(4) never (了解)(5) tuple类型 …

【Leetcode 每日一题】3274. 检查棋盘方格颜色是否相同

问题背景 给你两个字符串 c o o r d i n a t e 1 coordinate1 coordinate1 和 c o o r d i n a t e 2 coordinate2 coordinate2&#xff0c;代表 8 8 8 \times 8 88 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图。 如果这两个方格颜色相同&#xff0c;返回 t …

【Dubbo03】消息队列与微服务之dubbo-admin 二进制与编译安装

实战案例&#xff1a;二进制安装 dubbo-admin 新版用Golang重构&#xff0c;提供了二进制包&#xff0c;可以直接部署 #下载二进制包 [rootubuntu2204 ~]#wget https://github.com/apache/dubbo-admin/releases/download/0.5.0/apache-dubbo-admin-0.5.0-bin-release.tar.gz …

Kylin Server V10 下 Kafka 集群部署

一、ZooKeeper 集群部署 1、主机规划 主机名 IP 地址 myid 10.8.3.35 1 10.8.3.36 2 10.8.3.37 3 2、拓扑结构 3、部署 (1) 下载Zookeeper [root@localhost ~]# cd /usr/local [root@localhost local]# wget https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-…

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

SpringBoot两天

SpringBoot讲义 什么是SpringBoot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xf…

vue3项目最新eslint9+prettier+husky+stylelint+vscode配置

一、eslint9和prettier通用配置 安装必装插件 ESlint9.x pnpm add eslintlatest -DESlint配置 vue 规则 , typescript解析器 pnpm add eslint-plugin-vue typescript-eslint -DESlint配置 JavaScript 规则 pnpm add eslint/js -D配置所有全局变量 globals pnpm add globa…

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型&#xff08;Matlab&#…

【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)

引用此数据集&#xff1a; Sharma, Ankur (2020), “Onco-fetal reprogramming of endothelial cells drives immunosuppressive macrophages in Hepatocellular Carcinoma (Sharma et al)”, Mendeley Data, V1, doi: 10.17632/6wmzcskt6k.1 下载地址&#xff1a;Onco-feta…

A30 PHP+MYSQL+LW+工厂库存仓储订单销售后台管理系统的设计与实现 源代码 配置 文档

工厂库存仓储订单销售管理系统 1.摘要2.开发目的和意义3.系统功能设计4.数据库设计5.系统界面截图6.源码获取 1.摘要 互联网给人们生活带来了极大的转变&#xff0c;现代化、信息化管理系统也成为企业管理的必要手段。电子信息化服务模式&#xff0c;一切以信息化手段来处理和…

利用Docker一键发布Nginx-Tomcat-MySQL应用集群

Docker简介&#xff0c;可以看上一篇文章&#xff1a; 为什么互联网公司离不开Docker容器化&#xff0c;它到底解决了什么问题&#xff1f;-CSDN博客 Docker体系结构 docker核心就是镜像和容器&#xff1a; 镜像就是应用程序的安装文件&#xff0c;包含了所有需要的资源&…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word&#xff08;1&#xff09;打开文档&#xff08;2&#xff09;添加标题&#xff08;3&#xff09;添加段落&#xff08;4&#xff09;添加文字块&#xff08;5&#xff09;添加图片&#xff08;6&#xf…