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

目录

  • 一、:⾯试题 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.mzph.cn/pingmian/62965.shtml

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

相关文章

【Docker】针对开发环境、测试环境、生产环境如何编排?

目录 一、引言 二、Docker Compose 文件基础 三、针对不同环境的 Docker 编排 开发环境 测试环境 生产环境 四、配置文件全局变量的编写 五、总结 一、引言 在软件开发和部署的过程中&#xff0c;不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术&…

Flink:入门介绍

目录 一、Flink简介 2.1 Flink 架构 2.2 Flink 应用程序 运行模式 二、Flink 集群 部署 2.1 本地集群模式 2.1.1 安装JDK​编辑 2.1.2 下载、解压 Flink 2.1.3 启动集群 2.1.4 停止集群 2.2 Standalone 模式 2.2.0 集群规划 2.2.1 安装JDK 2.2.2 设置免密登录 2…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程&#xff08;RDMA read and write with IB verbs&#xff09; &#xff08;本文讲解的示例代码在&#xff1a;RDMA read and write with IB verbs | The Geek in the Corner&#xff09; 将 RDMA 与verbs一起使用非常简单&#xff1a;首先注册内存块&#xff0c…

洛谷P2670扫雷游戏(Java)

三.P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩…

Git 详解

Git 详解 Git 是一个分布式版本控制系统&#xff0c;用于高效地管理项目代码的版本历史。它是目前最流行的版本控制工具之一&#xff0c;广泛应用于软件开发领域。Git 的分布式架构允许开发者在本地进行代码的版本管理&#xff0c;并与远程仓库同步&#xff0c;实现团队协作。…

JMS和消息中间件:Kafka/RocketMQ

文章目录 消息传递模型使用JMS还是KafkaKafka与RocketMQ的优缺点Kafka与RocketMQ的使用场景Kafka与RocketMQ的选型指南 TPM 项目中&#xff0c; iflow之间使用了JMS&#xff0c;后端项目与数据库通信使用Kafka MQ和JMS的区别&#xff1a; JMS是 java 用来处理消息的一个API规范…

深入浅出:Go语言中map的工作原理详解

目录 map 的简介哈希表的基础概念Go 中 map 的内部结构创建和使用 mapmap 的扩容机制处理冲突的方法map 的并发安全map 性能优化策略实际应用案例常见问题解答参考资料 深入浅出&#xff1a;Go 语言中 map 的工作原理与性能优化 map 的简介 在 Go 语言中&#xff0c;map 是…

泷羽sec专题课笔记-- Linux作业--开机自启动方法以及破解

本笔记为 泷羽sec 《红队全栈课程》学习笔记&#xff0c;课程请可自行前往B站学习&#xff0c;课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等&#xff0c;请使用该课程、本笔记以及课程和笔记中提及工具的读者&#xff0c;遵守网络安全相关法律法规&#xff0c;切勿…

Linux内核早期打印机制与RS485通信技术

往期内容 本专栏往期内容&#xff1a;Uart子系统 UART串口硬件介绍深入理解TTY体系&#xff1a;设备节点与驱动程序框架详解Linux串口应用编程&#xff1a;从UART到GPS模块及字符设备驱动 解UART 子系统&#xff1a;Linux Kernel 4.9.88 中的核心结构体与设计详解IMX 平台UART驱…

汽车网络安全 -- IDPS如何帮助OEM保证车辆全生命周期的信息安全

目录 1.强标的另一层解读 2.什么是IDPS 2.1 IDPS技术要点 2.2 车辆IDPS系统示例 3.车辆纵深防御架构 4.小结 1.强标的另一层解读 在最近发布的国家汽车安全强标《GB 44495》,在7.2节明确提出了12条关于通信安全的要求,分别涉及到车辆与车辆制造商云平台通信、车辆与车辆…

如何利用内链策略提升网站的整体权重?

内链是谷歌SEO中常常被低估的部分&#xff0c;实际上&#xff0c;合理的内链策略不仅能帮助提升页面间的关联性&#xff0c;还可以增强网站的整体权重。通过正确的内链布局&#xff0c;用户可以更流畅地浏览你的网站&#xff0c;谷歌爬虫也能更快地抓取到更多页面&#xff0c;有…

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

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

力扣第90题:带重复元素的子集

力扣第90题&#xff1a;带重复元素的子集 问题描述 给定一个整数数组nums&#xff0c;该数组可能包含重复元素。返回该数组所有可能的子集&#xff08;幂集&#xff09;&#xff0c;并且子集中的元素需要去重。返回的子集中的每个元素应按照非递减顺序排列。 例如&#xff0…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十九,ffmpeg封装

封装就是将 一个h264&#xff0c;和一个aac文件重新封装成一个mp4文件。 这里我们的h264 和 aac都是来源于另一个mp4文件&#xff0c;也就是说&#xff0c;我们会将 in.mp4文件解封装成一路videoavstream 和 一路 audioavstream&#xff0c;然后 将这两路的 avstream 合并成一…

LVS默认的工作模式支持哪些负载均衡算法?

LVS默认的工作模式支持哪些负载均衡算法? LVS&#xff08;Linux Virtual Server&#xff09;默认支持多种负载均衡算法&#xff0c;这些算法在不同的场景下具有各自的优势。以下是 LVS 默认支持的负载均衡算法及其特点&#xff1a; 1. 轮询调度&#xff08;Round Robin Sched…

汇编语言学习-二

好吧&#xff0c;已经隔了两天&#xff0c;下完班看了两天&#xff0c;在电脑上装了虚拟机版的MS_DOS,主要是怕折腾坏我的电脑系统&#xff1b; 这个第二天应该是称为第二章更为合适&#xff0c;目前第二章已经看完&#xff0c;基本的命令也是敲了敲&#xff1b; 下面就进行一…

等差数列末项计算

等差数列末项计算 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给出一个等差数列的前两项a1&#xff0c;a2&#xff0c;求第n项是多少。 输入 一行&#xff0c;包含三个整数a1&#xff0c;a2&#x…

【笔记2-1】ESP32:基于vscode的espidf插件的开发环境搭建

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…

Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)

17.3 在集群中执行命令 接收命令的节点会计算出命令要处理的数据库键属于哪个槽&#xff0c;并检查这个槽是否指派给了自己&#xff1a; 如果是的话&#xff0c;直接执行这个命令 否则&#xff0c;节点向客户端返回一个MOVED错误&#xff0c;指引客户端转向redirect至正确的节…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…