算法基础——位运算,双指针,排序,二分

目录

1.位运算

与:&

或:|

取反:~

异或:^或者是一个圈里有个加号的图像

移位:<<或者>>

例题:二进制中1的个数

例题:我们需要0

​编辑 

 2.排序sort

例题:【模板】排序(1)

例题:【模板】排序(2) 

 桶排序:

例题:【模板】排序(3)

3.双指针

例题:最长连续不重复子序列

4.二分

例题:查找

 


1.位运算

位运算是以每一位的形式来进行的

与:&

只有两个都为1才是1

3为011

4为100

所以3&4 = 000 = 0

或:|

只要有一个为1则是1

取反:~

与非类似,但非是一个逻辑运算,只要一个数大于0,对它!结果都为0

而取反是按位来进行的

~1 = 0

~0 = 1

异或:^或者是一个圈里有个加号的图像

只要两个不同就为1,举例:

1^0为1,0^1为1

移位:<<或者>>

将所有位往左移或者往右移,过界会直接溢出,所以一般只对正数做这个操作,因为左移时最高一位的符号位会溢出

举例:3为00011,<<3为00110,变为6,乘以了2

同理,右移就是除以2

例题:二进制中1的个数

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e9 + 10;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	while(n--)
	{
		ll a;
		ll ans = 0;
		cin >> a;
		while(a)
		{
			if(a & 1) ans++;
			a >>= 1;
		}
		cout << ans << ' ';
	}
	return 0;
}

例题:我们需要0

奇数个x异或的结果为x

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e9 + 10;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		ll ans = 0;
		for(int i = 1; i <= n; i++){
			ll a;
			cin >> a;
			ans ^= a;
		}
		cout << ans << '\n';
	}
	return 0;
}

 2.排序sort

stl里面的sort

sort是一个左闭右开的区间

例题:【模板】排序(1)

使用sort升序排序好后

使用unique可以将重复的元素移动到最后面,再让下标指向最后面的第一个重复的位置的下标

在使用erase从这个下标开始删除到尾部,就可以得到一个排序去重的序列 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 2e9 + 10;

vector<int> v;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		v.push_back(x);
	}
	
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());
	
	for(auto &ele : v)
		cout << ele << ' ';
	return 0;
}

例题:【模板】排序(2) 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 2e5 + 10;

struct book
{
	int h,s,w;
	bool operator <(const book &b)const
	{
		if(h == b.h && s == b.s) return w > b.w;
		if(h == b.h) return s > b.s;
		return h > b.h;
	}
}b[N];


int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	
	int n;
	cin >> n;
	for(int i = 0; i < n; i++)
		cin >> b[i].h >> b[i].s >> b[i].w;
	
	sort(b,b + n);
	
	for(int i = 0; i < n; i++)
		cout << b[i].h << ' ' << b[i].s << ' ' << b[i].w << '\n';
		
	return 0;
}

用cmp比较也可以

 

 桶排序:

数组很长,数据范围很小

例题:【模板】排序(3)

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 3e6 + 10;
int a[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin >> n;
	
	for(int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		a[x]++;	
	}
	
	for(int i = 0; i <= 2e5; i++){
		for(int j = 0; j < a[i]; j++)
			cout << i << ' ';
	}
	
	return 0;
}

3.双指针

例题:最长连续不重复子序列

这里用了桶的思想 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e5 + 10;
int a[N],c[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		for(int i = 1; i <= n; i++)
			cin >> a[i];
		
		for(int i = 1; i <= n; i++)
			c[i] = 0;
			
		ll ans = 0;
		for(int i = 1,j = 0; i <= n; i++)
		{
			while(j < n && c[a[j + 1]] == 0)
				c[a[++j]]++;
			
			ans = max(ans,j - i + 1ll);
			c[a[i]]--;
		}
		cout << ans << '\n';
	}
	return 0;
}

4.二分

例题:查找

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 2e5 + 10;
ll a[N],c[N];

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,q;
	cin >> n >> q;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	
	while(q--)
	{
		int left = 1,right = n,found = 0;
		int x;
		cin >> x;
		int mid;
		while(left <= right && !found)
		{
			mid = (left + right) / 2;
			if(a[mid] > x) right = mid - 1;
			if(a[mid] < x) left = mid + 1;
			if(a[mid] == x) found = 1;
		}
		if(found) cout << mid << ' ';
		else cout << -1 << ' ';
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大坑!react+thress.js

2. UI交互界面与Canvas画布叠加 | Three.js中文网 (webgl3d.cn) // canvas画布绝对定位 renderer.domElement.style.position absolute; renderer.domElement.style.top 0px; renderer.domElement.style.left 0px; renderer.domElement.style.zIndex -1; 我按照教程设置了…

红日三打靶!!!

红日三&#xff0c;黑盒测试 环境搭建一.外网打点1.网段探测2.端口服务扫描3.目录扫描4.网站漏洞扫描5.汇总&#xff0c;找破绽6.登陆MySQL改密码 7.进入后台&#xff0c;找能写马的地方8.蚁剑连接9.disable_functions绕过1.蚁剑插件绕过2.bypass_disablefunc_via_LD_PRELOAD绕…

AutoEncoder自动编码器、VAE变分自编码器、VQVAE量子化(离散化)的自编码器

文章目录 AutoEncoder自动编码器&#xff08;一&#xff09;AutoEncoder的基本架构&#xff08;二&#xff09;AutoEncoder的概率理解&#xff08;三&#xff09;AutoEncoder的局限 VAE变分自编码器&#xff08;Variational AutoEncoder&#xff09;&#xff08;一&#xff09;…

uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手

文章目录 &#x1f4cb;前言⏬关于专栏 &#x1f3af;什么是生命周期&#x1f9e9;应用生命周期&#x1f4cc; 关于 App.vue/App.uvue &#x1f9e9;页面生命周期&#x1f4cc;关于 onShow 与 onLoad 的区别 &#x1f9e9;组件生命周期 &#x1f4dd;最后 &#x1f4cb;前言 这…

uniapp 组件封装

1. uniapp 组件封装时间戳格式化为星期 1.1. components/m-week.vue <template><text>{{week}}</text> </template> <script>export default {props: {time: String},mounted(e) {this.week this.getWeek(Number(this.time))},data() {return …

挑战杯 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

[python]基于opencv实现的车道线检测

【检测原理】 一、首先进行canny边缘检测&#xff0c;为获取车道线边缘做准备 二、进行ROI提取获取确切的车道线边缘&#xff08;红色线内部&#xff09; 三、利用概率霍夫变换获取直线&#xff0c;并将斜率正数和复数的线段给分割开来 四、离群值过滤&#xff0c;剔除斜率…

Java设计模式 – 四大类型

设计模式 – 四大类型 创建型模式结构型模式行为型模式J2EE模式 设计模式&#xff08;Design pattern&#xff09;是重构解决方案 根据书Design Patterns – Elements of Reusable Object-Oriented Software&#xff08;中文译名&#xff1a;设计模式 – 可复用的面向对象软件元…

lava学习-接口

接口-Interface 1.什么是接口&#xff1f; 例&#xff1a;构造器&#xff0c;代码块在接口中统统没有&#xff0c;也不能创建对象 构造器的使用-----实现类 例&#xff1a;下图中的B类就是一个 实现类 2.接口的好处 继承只能单继承&#xff0c;而接口可以弥补类单继承的不足&am…

【蓝桥杯】环形链表的约瑟夫问题

目录 题目描述&#xff1a; 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解法一&#xff08;C&#xff09;&#xff1a; 解法二&#xff08;Cpp&#xff09;&#xff1a; 正文开始&#xff1a; 题目描述&#xff1a; 据说著名犹太历史学家 Josephus 有过以下故事&a…

作业2.3

一&#xff0e;选择题 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后&…

有趣的CSS - css loading动画

Loading动画 整体效果核心代码html 代码&#xff1a;css 部分代码&#xff1a; 完整代码如下html 页面&#xff1a;css 样式&#xff1a;页面渲染效果&#xff1a; 整体效果 这个 Loading 效果主要用 css3 的 animation 属性配合 border 属性来实现的。 可以用作在下拉列表 Loa…

(bean配置类的注解开发)学习Spring的第十三天

bean配置类的注解开发 问题提出 用类充当配置文件 applicationcontext.xml : Configuration注解标识此类为配置类,替代原有xml文件 看原配置文件applicationcontext.xml代码 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http:/…

微信小程序(三十二)本地异步储存API

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.同步和异步API的使用区别 2.异步API的缺陷 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item&q…

使用MATLAB驱动USRP-N320实现OFDM自收自发

文章目录 前言一、收发代码二、截取一帧 OFDM三、执行主函数四、运行结果五、资源自取 前言 本文作为实验结果记录及测试&#xff0c;方便后面回顾所做的工作。本文基于一台电脑和一台 USRP 设备实现了 OFDM 自发和自收功能 一、收发代码 ofdm_tx_rx_test.m 核心代码&#x…

C++迷宫游戏详解

个人主页&#xff1a;[PingdiGuo_guo] 收录专栏&#xff1a;[C干货专栏] 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习用C实现一个迷宫游戏。 目录 1.迷宫的具体步骤 1.1.迷宫的初始化 1.2.寻路算法 1.DFS算法 2.BFS算法 1.3.移动 2.总结 C迷宫游…

【js逆向】scrapy基础

目录 一, 爬虫工程化 二, scrapy简介 三, Scrapy工作流程(重点) 四, scrapy安装 4.1 pip 安装 4.2 wheel安装 五, Scrapy实例 六, 自定义数据传输结构item 七, scrapy使用小总结 一, 爬虫工程化 在之前的学习中我们已经掌握了爬虫这门技术需要的大多数的技术点, 但是我…

MAX31865读取PT100/PT1000电阻值

1、芯片介绍 MAX31865是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度,高精度Δ- Σ ADC将RTD电阻与基准电阻之比转换为数字输出。MAX31865输入具有高达45V的过压保护,提供可配置的RTD及电缆开路、短路条件检测。 2、芯片特点…

金和OA jc6 UploadFileBlock 任意文件上传漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

光伏移动业主端:操作便捷,功能齐全

鹧鸪云 为了满足日益增长的移动设备使用需求&#xff0c;提高用户体验&#xff0c;鹧鸪云研发出移动业主端&#xff0c;旨在提供更加高效、便捷的操作体验&#xff0c;具有省时省力、方便操作、功能齐全等优势&#xff0c;能够带来更好的使用体验和智能化服务。 优势&#xf…