【算法】【优选算法】位运算(下)

news2024/12/27 15:10:31

目录

  • 一、:⾯试题 01.01.判定字符是否唯⼀
    • 1.1 位图
    • 1.2 hash思路
    • 1.3 暴力枚举
  • 二、268.丢失的数字
    • 2.1 位运算,异或
    • 2.2 数学求和
  • 三、371.两整数之和
  • 四、137.只出现⼀次的数字 II
  • 五、⾯试题 17.19.消失的两个数字

一、:⾯试题 01.01.判定字符是否唯⼀

题目链接::⾯试题 01.01.判定字符是否唯⼀
题目描述:

题目解析:

  • 给一个字符串,看字符串中字符是否有重复,有返回false,没有返回true。

1.1 位图

解题思路:

  • 因为这个字符串全是小写字符,所以只有26个字符,并且求得是是不是有重复。
  • 那么我们就可以使用一个int的32个比特位来表示,字符’a’到’z’分别对应二进制的0到25下标。
  • 如果下标变成1,后出现了该下标对应的字母,那么就是有重复字符。
  • 拿到二进制第 i 位是1还是0:(x >> i) & 1
  • 将二进制第 i 位变为1:x = x | (1 << i)

解题代码:

//时间复杂度:O(N)
//空间复杂度:O(1)
class Solution {
    public boolean isUnique(String astr) {
        if(astr.length() > 26) return false;
        int bit = 0;
        for(int i = 0; i < astr.length(); i++) {
            int temp = bit;
            if( ( (temp >> astr.charAt(i) ) & 1) == 1) return false;
            bit = bit | ( 1 << astr.charAt(i));
        }
        return true;
    }
}

1.2 hash思路

解题思路:

  • 使用一个hash数组来记录每个字符出现的次数,因为全是小写字母,只需申请有效空间即可。

解题代码:

//时间复杂度:O(N)
//空间复杂度:O(1)
class Solution {
    public boolean isUnique(String astr) {
        if(astr.length() > 26) return false;
        int[] hash = new int[26];
        for(int i = 0; i < astr.length(); i++) {
            if(hash[astr.charAt(i)-'a'] != 0) return false;
            hash[astr.charAt(i)-'a']++;
        }
        return true;
    }
}

1.3 暴力枚举

解题思路:

  • 直接两层for循环遍历,第一层遍历字符,第二层在剩下字符串种找是否有相同字符。

解题代码:

//时间复杂度:O(n^2)
//空间复杂度:O(1)
class Solution {
    public boolean isUnique(String astr) {
        if(astr.length() > 26) return false;
        for(int i = 0; i < astr.length(); i++) {
            for(int j = i+1; j < astr.length(); j++) {
                if(astr.charAt(i) == astr.charAt(j)) return false; 
            }
        }
        return true;
    }
}

二、268.丢失的数字

题目链接:268.丢失的数字
题目描述:

题目解析:

  • 给一个长度为n的数组,数组中在[ 0 , n ]中只有一个数字没包含,返回这个数字。

2.1 位运算,异或

解题思路:

  • 将数组中的元素一一进行异或运算,同时与[ 0 , n ]的数字进行异或运算。
  • 到最后这剩下数组中没有的元素,没有与相同数字进行异或运算,最后就只剩下他了。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public int missingNumber(int[] nums) {
        int ret = 0;
        for(int i = 0; i < nums.length; i++) {
            ret = ret ^ i ^ nums[i];
        }
        return ret ^ nums.length;
    }
}

2.2 数学求和

解题思路:

  • 先将[ 0 , n ]的和求出来。然后遍历数组,减去数组中元素。最后剩下的就是要求的数字。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public int missingNumber(int[] nums) {
        int n = nums.length;
        int sum = (n+1) * n / 2;
        for(int i = 0; i < n; i++)
            sum -= nums[i];
        return sum;
    }
}

三、371.两整数之和

题目链接:371.两整数之和
题目描述:

题目解析:

  • 不使用加法,算a+b

解题思路:

  • 使用异或,异或是无进位相加。
  • 那么我们只需要将要进位的地方记录下来,要进位的地方是两个数都是1才进位。也就是 按位与的结果,但是下一次异或的是,上一次按位与结果左移一位的结果。
  • 所以我们最多按位异或,按位与32次。

解题代码:

//时间复杂度:O(1)
//空间复杂度:O(1)
class Solution {
    public int getSum(int a, int b) {
        while( b != 0) {
            int temp = a;
            a = a ^ b;
            b = (temp & b) << 1;
        }
        return a;
    }
}

四、137.只出现⼀次的数字 II

题目链接:137.只出现⼀次的数字 II
题目描述:

题目解析:

  • 给一个数组,数组中只有一个元素只出现一次,其余全出现了3次,返回只出现一次的那个元素。

解题思路:

  • 当我们将数组中元素的每一位比特位求和之后,假设只出现一次的数的比特位上是x,那么每位上的和都是3n+x。n就代表出现3次的元素的比特位求一次和的结果。
  • 所以当我们将和对3取余后,那么该比特位上的值就和要求元素一样了。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public int singleNumber(int[] nums) {
        int ret = 0;
        for(int i  = 0; i < 32; i++) {
        	//求比特位之和
            int sum = 0;
            for(int x : nums) {
                sum += ( (x>>i) & 1);
            }
            //修改结果对应比特位
            sum %= 3;
            if(sum == 1) ret = ret | (1 << i);
        }
        return ret;
    }
}

五、⾯试题 17.19.消失的两个数字

题目链接:⾯试题 17.19.消失的两个数字
题目描述:

题目描述:

  • 给一个数组,这个数组在[ 1 , nums.length + 2]区间有两个数不包含,找到并返回。

解题思路:

  • 其实这道题跟上一篇的第六道是一道题。
  • 先将所有的元素(数组元素和[ 1 , nums.length + 2] 的数)全部异或在一起,就相当于两个只出现一次的元素异或在一起。
  • 在去出上诉异或结果,最右边的1。这位上两个数字是不相同的。
  • 所以再次遍历数组与结果数组异或,如果该位上与第二步结果相同放一个下标,不同放另一个下标。最后得到的就是结果了

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public int[] missingTwo(int[] nums) {
        int n = nums.length;
        int[] ret = new int[2];
        int last = 0;
        for(int i = 0; i <= n+2; i++) {
            if(i < n) last ^= nums[i];
            
            last ^= i;
        }
        last = last & -last;
        for(int i = 0; i <= n+2; i++) {
            if(i < n) {
                if((last & nums[i]) == 0)  ret[0] ^= nums[i];
                else ret[1] ^= nums[i];
            }
            if((last & i) == 0) ret[0] ^= i;
            else  ret[1] ^= i;
            
        }
        return ret;
    }
}

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

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

相关文章

深度学习中注意力机制介绍及seq2seq案例

一. 注意力机制介绍 普通机器翻译 图中表示的是一个中文到英文的翻译&#xff1a;欢迎 来 北京 → welcome to BeiJing。编码器首先处理中文输入"欢迎 来 北京"&#xff0c;通过GRU模型获得每个时间步的输出张量&#xff0c;最后将它们拼接(按位相加)成一个中间语义张…

工业—使用Flink处理Kafka中的数据_ChangeRecord2

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据&#xff0c;每隔 1 分钟输出最近 3 分钟的预警次数最多的 设备&#xff0c;将结果存入Redis 中&#xff0c; key 值为 “warning_last3min_everymin_out” &#xff0c; value 值为 “ 窗口结束时间&#xff0c;设备id” &am…

Android 消息队列之MQTT的使用:物联网通讯,HTTP太重了,使用MQTT;断网重连、注册、订阅、发送数据和接受数据,实现双向通讯。

目录&#xff1a; 问题MQTT是什么以及为什么使用如何使用&#xff1a;第一阶段、基础功能如何使用&#xff1a;第二阶段、增加断网重连如何使用&#xff1a;第三阶段、封装 一、问题 在开发的时候&#xff0c;我们一般都使用Http和后台进行通讯&#xff0c;比如我们是开发物联…

项目-02-数学学院后台项目开发过程中的问题总结

目录 一、后台&#xff08;pc端&#xff0c;vue2&#xff09;1. dialog对话框被黑色蒙层盖住2. 将前端表格导出为word文档3. 在线查看、下载 .docx、.doc、.pdf文档 一、后台&#xff08;pc端&#xff0c;vue2&#xff09; 1. dialog对话框被黑色蒙层盖住 问题&#xff1a; d…

大数据实验E5HBase:安装配置,shell 命令和Java API使用

实验目的 熟悉HBase操作常用的shell 命令和Java API使用&#xff1b; 实验要求 掌握HBase的基本操作命令和函数接口的使用&#xff1b; 实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者CentOS 7 以上&#xff09;&#xff1b;Hadoop版本&#xff1a;3…

使用Tomcat搭建简易文件服务器

创建服务器 1. 复制一个tomcat服务器&#xff0c;并命名为file-service(好区分即可) 2.在webapp里面新建一个文件夹 uploadfiles ,用于存储上传的文件 3. 修改conf/service.xml,配置文件服务器的端口与上传文件夹的访问 在Host标签之间加入一个Context标签 docBase"uploa…

【算法】位运算合集

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;位运算基础公式 零&#xff1a;五道基础题 1&#xff1a;位1的个数 2&#xff1a;比…

【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;这在低功率供…