算法专题五:位运算

算法专题五:位运算

  • 一.常见位运算总结:
    • 1.位1的个数
    • 2.比特位记数
    • 3.汉明距离
    • 4.只出现一次的数字
    • 5.只出现一次的数字三
  • 二.判断字符是否为一
    • 1.思路一:位运算思路
    • GIF题目解析
  • 三.丢失的数字
    • 1.思路一:暴力思路
    • 2.思路二:高斯求和思路:
    • 3.思路三:哈希思路
    • 4.思路四:位运算思路优化
  • 四.两整数之和
    • 1.思路一:按位异或+无进位相加
  • 五.只出现一次的数字二
    • 1.思路一:暴力思路+排序
    • 2.思路二:异或思路:
  • 六.消失的两个数字
    • 1.思路一

一.常见位运算总结:

1.位1的个数

在这里插入图片描述
位1的个数

class Solution {
public:int hammingWeight(uint32_t n) {int count = 0;for(int i=0;i<32;i++){if((n>>i)&1)count++;//按位与& 有0就是0//按位或| 有1就是1//按位异或^ 相同为0相异为1}return count;}
};

2.比特位记数

在这里插入图片描述
比特位计数

class Solution {
public:vector<int> countBits(int n) {vector<int> ans(n+1);//1.考虑一趟扫描!int hightbit = 0;for(int i=1;i<=n;i++){//1.判断是否需要更新数据:if((i&(i-1)) == 0){hightbit = i;}ans[i] = ans[i - hightbit]+1;}return ans;}
};

3.汉明距离

在这里插入图片描述
汉明距离

1.通过提出每一位然后于1按位与提出x或者y的每一位数值。
2.进行判断是否相等不相等就count++;

class Solution {
public:int hammingDistance(int x, int y) {int count = 0;for(int i=0 ; i<32 ; i++){if (((x>>i) & 1) != ((y>>i) & 1))count++;}return count;}
};

4.只出现一次的数字

在这里插入图片描述

只出现一次的数字

1.一组数按位在一起按照题目意思只有一个数只有自己。
2.其他数值都是一对一对。
3.两个相同的数按位异或在一起结果是0
4.0和所有数按位异或在一起结果为那个数本身。

class Solution {
public:int singleNumber(vector<int>& nums) {int value = 0;for(auto num:nums){value^=num;}return value;}
};

5.只出现一次的数字三

在这里插入图片描述

只出现一次的数字三

1.考虑特殊情况数组中只有两个元素直接返回这个数组。
2.排序:相同的数值一定相邻并且数组元素的个数为偶数。
3-1:特殊的两个数是相邻的–>指针移动长度
3-2:特殊的两个数是不是相邻的–>指针移动长度和边界控制问题!

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {//0.特殊情况:int n = nums.size();if(n==2)return nums;//1.排序sort(nums.begin(),nums.end());//2.创建双指针分析各种情况解决方案:int left = 0;int right = 1;vector<int> vv ;while(left<n && right<=n){//情况1: 1 1 2 3 3 4 4 5if(right == n){vv.push_back(nums[left]);break;}                if(nums[left]==nums[right]){left+=2;right+=2;}else{vv.push_back(nums[left]);left+=1;right+=1;}}return vv;}
};

二.判断字符是否为一

在这里插入图片描述
判断字符是否唯一

1.思路一:位运算思路

在这里插入图片描述

class Solution {
public:bool isUnique(string astr) {int n = astr.size();if(n > 26)return false;int bitmap = 0;for(auto ch : astr){int count = ch - 'a';if(((bitmap>>count) & 1) == 1)return false;bitmap |= (1<<count);}return true;}
};

GIF题目解析

三.丢失的数字

1.思路一:暴力思路

class Solution {
public:int missingNumber(vector<int>& nums) {int n = nums.size();if(n == 1){if(nums[0] == 1) return 0;if(nums[0] == 0) return 1;}//1.排序:sort(nums.begin() , nums.end());//2.遍历找数:for(int i=0 ; i < n ; i++){if(i != nums[i])return i;}return n;}
};//时间复杂度 1.排序:n*long^n  2. 遍历o(n)
//空间复杂度 O(1)

2.思路二:高斯求和思路:

class Solution {
public:int missingNumber(vector<int>& nums) {//1.求数组个数:int n = nums.size();//2.求从0到n的和long long sum_1 = ((0+n)*(n+1))/2;//3.遍历数组求和long long sum_2 = 0;for(auto num : nums){sum_2 += num;}//4.计算结果:return (sum_1 - sum_2);}
};//1.时间复杂度:O(n)
//2.空间复杂度为:O(1)

3.思路三:哈希思路

class Solution {
public:int missingNumber(vector<int>& nums) {//1.计算数组长度:int n = nums.size();//2.开一个哈希表vector<int> hash(n+1);//3.遍历数组第一遍给hash赋值:for(auto num_1 : nums){hash[num_1]++;}//4.遍历hash第一遍判断没有的返回出来:for(int i=0 ; i < n+1 ;i++){if (hash[i] == 0)return i;}//照顾leetcodereturn 0;}
};//时间复杂度:O(n)
//空间复杂度:O(n)

4.思路四:位运算思路优化

class Solution {
public:int missingNumber(vector<int>& nums) {//1.计算长度int n = nums.size();//2.异或所有数据:int ret = 0;for(int i=0 ; i<n ; i++){ret^=nums[i];}for(int i=0 ; i<=n ;i++){ret^=i;}return ret;}
};//时间复杂度:O(n)
//空间复杂度:O(1)

四.两整数之和

在这里插入图片描述
两整数之和

1.思路一:按位异或+无进位相加

在这里插入图片描述

class Solution {
public:int getSum(int a, int b) {while(((a&b)<<1)!=0){//0.保存数据int tmp = a;//1.a的更新:tmp = a^b;//2.b的更新b = ((a&b)<<1);//3.数据归还a = tmp;}return a^b;}
};

五.只出现一次的数字二

在这里插入图片描述

只出现一次的数字二

1.思路一:暴力思路+排序

class Solution {
public:int singleNumber(vector<int>& nums) {if(nums.size()==1)return nums[0];//1.排序sort(nums.begin(),nums.end());//2.三指针遍历数据:int l = 0;int m = 1;int r = 2;while(l < nums.size()){if( m >= nums.size() && r >= nums.size()){return nums[l];}if(nums[m] == nums[r] && nums[m] != nums[l]){return nums[l];}else {l+=3;m+=3;r+=3;}}return 0;}
};

2.思路二:异或思路:

在这里插入图片描述

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i=0;i<32;i++){int sum = 0;for(int x:nums){if(((x>>i)&1) == 1)sum++;}//推广到只出现n次的数组!sum%=3;//3改变为nif(sum == 1) ret |= (1<<i);}return ret;}
};//时间复杂度是:O(n)
//空间复杂度是:O(1)

六.消失的两个数字

1.思路一

在这里插入图片描述

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

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

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

相关文章

第14课 多维数组

文章目录 前言一、多维数组的定义二、多维数组的初始化三、多维数组的使用&#xff08;以二维数组为例&#xff09;1. 矩阵转置问题 三、课后练习1. 求一个m*n矩阵中所有元素的累加和2. 查找并输出一个m*n矩阵中的最小元素以及其在矩阵中的位置3. 将m*n矩阵A复制为m*n矩阵B&…

FA对接FC流程

2、FA进行对接 &#xff08;1&#xff09;首先安装好AD域控服务器DHCPDNS&#xff08;注意&#xff0c;不要忘记了做DNS正反向解析&#xff0c;就是把已经安装了ITA的主机做解析&#xff09;&#xff0c;在里面创建域用户 &#xff08;2&#xff09;安装ITA和VAG/VLB&#xf…

js 对象

js 对象定义 <!DOCTYPE html> <html> <body><h1>JavaScript 对象创建</h1><p id"demo1"></p> <p>new</p> <p id"demo"></p><script> // 创建对象&#xff1a; var persona {fi…

SiteGround 注册无法接收短信验证码问题的解决方法

在购买SiteGround后&#xff0c;有时会出现需要进行账号验证的情况&#xff0c;要求通过短信或电话完成验证。然而&#xff0c;有些用户无论如何操作都无法收到短信验证码。以下是解决这个问题并成功完成服务器购买的方法。 Thank You for Your Purchase! Lets Verify Your Ord…

2024的十大技术趋势预测

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 2024年&#xff0c;科技圈还会有什么样的新鲜新发生&#xff1f;techradar的记者Lance Ulanoff预测了科技圈的2024十大趋势&#xff0c;包括AI、…

最优轨迹生成(四)—— 带约束轨迹优化

本系列文章是学习深蓝学院-移动机器人运动规划课程第五章最优轨迹生成 过程中所记录的笔记&#xff0c;本系列文章共包含四篇文章&#xff0c;依次介绍了微分平坦特性、无约束BVP轨迹优化、无约束BIVP轨迹优、 带约束轨迹优化等内容 本系列文章链接如下&#xff1a; 最优轨迹生…

9. 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…

关于Python里xlwings库对Excel表格的操作(二十四)

这篇小笔记主要记录如何【如何使用xlwings库中的“api”类设置单元格边界线型、粗细、颜色】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b;…

在Google Colab中调用Gemini的API实现智能问答

一、引言 Google终于放出大招&#xff0c;在2023年12月6日正式推出规模最大、功能最强大的人工智能模型Gemini&#xff0c;对标ChatGPT&#xff0c;甚至有要赶超ChatGPT-4.0的节奏。 相比之前的Bard&#xff0c;Gemini的文本理解能力、图片识别能力和语义抽取能力大大增强&am…

[C#]使用ONNXRuntime部署一种用于边缘检测的轻量级密集卷积神经网络LDC

源码地址&#xff1a; github.com/xavysp/LDC LDC: Lightweight Dense CNN for Edge Detection算法介绍&#xff1a; 由于深度学习方法的快速发展&#xff0c;近年来&#xff0c;用于执行图像边缘检测的卷积神经网络&#xff08;CNN&#xff09;模型爆炸性地传播。但边缘检测…

山西电力市场日前价格预测【2024-01-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-02&#xff09;山西电力市场全天平均日前电价为92.93元/MWh。其中&#xff0c;最高日前电价为275.90元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出现…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…