当前位置: 首页 > news >正文

【位运算】--- 初阶题目赏析

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:       9ilk

(๑•́ ₃ •̀๑) 文章专栏:     算法Journey  


根据上一篇位运算的总结,我们来体会几道初阶题目。


🏠 判定字符是否唯一

📌 题目解析

判定字符是否唯一

  • s[i]中只包含小写字母。

📌 算法原理

✏️ 思路一:哈希表

利用哈希表对小写字母进行映射,如果遍历过程中出现已经映射的直接返回false,若遍历完之后都没有出现映射两次的则返回true。

时间复杂度:O(N) 

空间复杂度:O(N)

class Solution {
public:bool isUnique(string astr){bool flag = true;int arr[27] = { 0 };//数组模拟哈希表for (int i = 0; i < astr.size(); i++){char ch = astr[i];int pos = ch - 'a' + 1;arr[pos] ^= pos;if (!arr[pos]){flag = false;break;}}return flag;}
};

✏️ 思路二:位图思想

一个int有4个字节,也就是有32个bit。我们这里都是小写字母,只需要利用26个bit位进行映射就能判断是否出现过。利用位运算判断映射位置是否为1,为1则出现过返回false;为0则没出现过,将该位设置为1。

优化: 抽屉原理

桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的"抽屉原理"。抽屉原理的一般含义为:"如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到到n个集合中去,其中必定有一个集合里至少有两个元素。"抽屉原理有时也被称为鸽巢原理。

由此我们可以得到,当字符串长度大于26时,一定会出现重复,字符串长度相当于抽屉,字符相当于苹果!

class Solution {
public:bool isUnique(string astr){if(astr.size()>26) //抽屉原理return false;int bitset = 0;for(auto& e : astr ){int pos = e - 'a';if((bitset >> pos )&1) //判断该位是否为1return false;bitset |=  (1 << pos);//设置为1   } return true;}
};

🏠 丢失的数字

📌 题目解析

丢失的数字

📌 算法原理

✏️ 思路一 :  高斯求和公式

知道了数组长度n,则原本数字总个数应该为n+1个.遍历一遍数组求和sum,由于高斯求和公式(等差数列公式),则我们可以求原本未缺失数字时的总和,减去sum就是缺失的数字。

参考代码:

class Solution {
public:int missingNumber(vector<int>& nums) {int size = nums.size() + 1;int count = (size*(size - 1)) / 2;cout << count <<endl;int sum = 0;for(auto e :nums){sum += e;}return count - sum;}
};

✏️ 思路二 : 异或运算

我们知道异或其中两条运算律是a^a=0和结合率,因此我们遍历一遍原来的数字,再遍历一遍缺失数组,最后得到的数就是缺失的数字,因为未缺失的在两次过程相当于出现两次,也就是会异或为0,最后只剩缺失的没有配对.

参考代码:

class Solution {
public:int missingNumber(vector<int>& nums) {  //思路:我们先将范围内的数异或再异或数组每一个数 最后得到的就是丢失的int ret = 0;int n = nums.size();for(int i = 0 ; i <= n ; i++){ret ^= i;} for(const auto& e : nums){ret ^= e;}return ret;}
};

🏠 两整数之和

📌 题目解析

两整数之和

📌 算法原理

我们前面说过按位与本质上是无进位相加。那多出来的进位信息在哪呢?其实按位与就能保存进位信息。那是因为如果两个数某个位上的数字都是1话,就需要进位,此时按位与得到的还是1,而如果两个数中有一位是0的话按位与就是0,因此通过按位与能很好的知道那一位进位,那一位不进位。

注:由于仅仅一次按位与只是提取到进位信息,重要的是不断地将进位信息用完,直到进位信息为0(进位信息用完)。因此我们需要不断地用进位信息进行无进位相加直到用完进位信息。同时要注意在进位的过程中也会产生进位。

参考代码:

class Solution {
public:int getSum(int a, int b){int next = (a & b) << 1; //进位信息 按位与之后再左移一位才是进位信息 因为进的位是给下一位的int ret = a ^ b;//无进位相加while (next){int del = next;next = (next & ret) << 1;ret ^= del; //用进位信息进行无进位相加}return ret;}
};

完。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜
  • 数据治理过程在选择数据源时,需要考虑哪些因素
  • Gin框架:获取请求头与设置响应头
  • 设计模式-单例模式工厂模式
  • 探索MongoDB的Python之钥:pymongo的魔力
  • Redis集群(cluster)
  • day15JS-es6的基础语法
  • EasyCVR中的H.265技术:助力实现大规模高效流畅的视频监控应用
  • Spring中基于redis stream 的消息队列实现方法
  • 计算机网络(一) —— 网络基础入门
  • codetest
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • Golang | Leetcode Golang题解之第383题赎金信
  • 达梦数据库-DM8 企业版安装指南
  • 使用IoC容器--Ninject
  • #Java异常处理
  • es6
  • javascript 总结(常用工具类的封装)
  • Koa2 之文件上传下载
  • python_bomb----数据类型总结
  • QQ浏览器x5内核的兼容性问题
  • sessionStorage和localStorage
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 06-01 点餐小程序前台界面搭建
  • Hibernate主键生成策略及选择
  • 昨天1024程序员节,我故意写了个死循环~
  • # 安徽锐锋科技IDMS系统简介
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #android不同版本废弃api,新api。
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (C)一些题4
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (十三)Flask之特殊装饰器详解
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)Dubbo快速入门、介绍、使用
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)scrum常见工具列表
  • (转载)Google Chrome调试JS
  • .mysql secret在哪_MySQL如何使用索引
  • .Net 6.0--通用帮助类--FileHelper
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决