优选算法——位运算


👇作者其它专栏

《数据结构与算法》《算法》《C++起始之路》


1.前要知识

《位操作符的妙用》

2.相关题解

2.1判定字符是否唯一

算法思路:

利用【位图】的思想,每一个【比特位】代表一个【字符】,一个int类型的变量的32位足够表示所有的小写字母。比特位里若为0,表示这个字符没有出现过;若为1,表示该字符出现过。

可以用一个【整数】来充当【哈希表】。

class Solution { public: bool isUnique(string astr) { //利用鸽巢原理优化 if(astr.size()>26) return false; int bitmap=0; for(auto i:astr){ int e=i-'a'; //先判断字符是否出现过 if(((bitmap>>e)&1)==1) return false; //把当前字符加入到位图中 bitmap|=1<<e; } return true; } };

2.2消失的数字

算法思路:

设数组的大小为n,则之前的数组就是[0,n],数组中是[0,n]中缺失一个数形成的序列。若,我们把数组中的所有数,以及[0,n]中的所有数全部【异或】在一起,那么根据【异或】运算的【消消乐】规则,最终的异或结果就是缺失的数字。

//1.哈希 2.高斯定理 3.位运算 4.排序+(暴力或二分) class Solution { public: int missingNumber(vector<int>& nums) { int ret=0; for(auto i:nums) ret^=i; for(int i=0;i<=nums.size();i++) ret^=i; return ret; } };

2.3两整数之和

算法思路:

●异或^运算本质是【无进位加法】;

●按位与&操作能够得到【进位】;

●然后一直循环进行,直到【进位】变成0为止

class Solution { public: int getSum(int a, int b) { while(b){ int x=a^b;//无进位相加的结果 //排除-1的情况 unsigned int carry=(a&b)<<1;//进位 a=x; b=carry; } return a; } };

2.4只出现一次的数字 II

算法思路:

设要找的数为ret。由于整个数组中,需要找的元素只出现了【一次】,其余的数都出现了【三次】,因此我们可以根据所有数的【某一个比特位】的总和%3的结果,快速定位到ret的【一个比特位】上的值是0还是1。

这样,我们通过ret的每一位比特位上的值,就可以将ret给还原出来。

class Solution { public: int singleNumber(vector<int>& nums) { int ret=0; for(int i=0;i<32;i++){//依次修改ret中的每一位 int sum=0; for(auto x:nums)//计算nums中所有第i位的和 if(x&(1<<i)) sum++; sum%=3; if(sum&1) ret|=1<<i; } return ret; } };

2.5只出现一次的数字 III

算法思路:

1.将所有数异或在一起,由于只有两个数出现一次,其余都出现两次。所以最后的结果为a^b

2.a和b不相等,因此a和b的二进制一定有至少一位不相同,

class Solution { public: vector<int> singleNumber(vector<int>& nums) { //1.将所有的数异或在一起 int tmp=0; for(auto x:nums) tmp^=x; //2.找出a,b中比特位不同的那一位 int diff=0; while(1){ if(((tmp>>diff)&1)==1) break; else diff++; } //3.根据diff位的不同,将所有数划分成两类 int a=0,b=0; for(auto x:nums){ if((1&(x>>diff))==1) b^=x; else a^=x; } return {a,b}; } };

2.6消失的两个数字

本题就是 2.2消失的数字+2.5只出现一次的数字 III组合起来的题。

现将数组中的数和[1,n+2]区间内的所有数【异或】在一起,问题就变成了:有两个数出现了【一次】,其余所有的数出现了【两次】。进而变成了2.5只出现一次的数字 III这道题。

class Solution { public: vector<int> missingTwo(vector<int>& nums) { //1.将所有的数异或在一起 int tmp=0; for(auto x:nums) tmp^=x; for(int i=1;i<=nums.size()+2;i++) tmp^=i; //2.找出a,b中比特位不同的那一位 int diff=0; while(1){ if(((tmp>>diff)&1)==1) break; else diff++; } //3.根据diff位的不同,将所有数划分成两类 int a=0,b=0; for(auto x:nums){ if((1&(x>>diff))==1) b^=x; else a^=x; } for(int i=1;i<=nums.size()+2;i++){ if((1&(i>>diff))==1) b^=i; else a^=i; } return {a,b}; } };

Read more

数据结构:⼆叉树(1)

数据结构:⼆叉树(1)

目录 前言  树部分知识: 一.树的概念和结构 二.树的一些相关术语和定义  三.树的实现结构(了解部分) 四、树的应用场景 二叉树部分知识讲解: 一.二叉树概念与结构 二.特殊二叉树类型 1.满二叉树 2.完全二叉树 3.性质补充 三、⼆叉树存储结构 顺序结构: 编辑应用: 链式结构: 四、堆的概念与结构 1.实现顺序结构⼆叉树: 2.堆的概念与结构 (重点) 3.堆的实现 五、堆的实现代码部分 1.堆的初始化:(本次实现选取大堆为例) 2.堆的销毁: 3.堆的插入数据 : 4.堆打印值 : 六、

By Ne0inhk
Flutter 三方库 libsignal 的鸿蒙化适配指南 - 实现 Signal 协议加密通信、双大鼠(Double Ratchet)算法与前向安全性保障

Flutter 三方库 libsignal 的鸿蒙化适配指南 - 实现 Signal 协议加密通信、双大鼠(Double Ratchet)算法与前向安全性保障

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 libsignal 的鸿蒙化适配指南 - 实现 Signal 协议加密通信、双大鼠(Double Ratchet)算法与前向安全性保障 前言 在 Flutter for OpenHarmony 的高度安全通信领域,Signal 协议是目前全球公认的即时通讯加密标准。libsignal 是 Signal 协议的核心 Dart 实现。它能够为鸿蒙应用提供从身份认证到会话加密的全套解决方案,确保每一个字节的通信都具备前向安全性(Forward Secrecy)。本文将深入解析如何在鸿蒙端利用该库构建极致安全的加密通信能力。 一、原理解析 / 概念介绍 1.1 基础原理 Signal 协议的核心在于“双大鼠(Double Ratchet)”算法。它结合了 Diffie-Hellman

By Ne0inhk
无中生有——无监督学习的原理、算法与结构发现

无中生有——无监督学习的原理、算法与结构发现

“世界上绝大多数数据都没有标签。 真正的智能,不是在已知答案中选择,而是在混沌中发现秩序。” ——无监督学习的哲学 一、为什么需要无监督学习? 在前七章中,我们系统学习了监督学习(Supervised Learning)的核心范式:给定输入 x\mathbf{x}x 和对应标签 yyy,学习映射 f:x↦yf: \mathbf{x} \mapsto yf:x↦y。无论是线性回归、决策树,还是神经网络,都依赖于标注数据这一稀缺资源。 然而,现实世界的数据绝大多数是未标注的: * 用户浏览日志(只有行为,没有“好/坏”标签); * 医学影像(只有图像,没有诊断结论); * 社交网络(只有连接关系,没有群体划分); * 传感器时序(只有数值流,没有异常标记)

By Ne0inhk
【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、读数据的过程 * 二、写数据的过程 * 小结 在介绍 HDFS 的数据读写过程之前,需要简单介绍一下相关的类。FileSystem 是一个通用文件系统的抽象基类,可以被分布式文件系统继承,所有可能使用

By Ne0inhk