双指针法|位运算|离散化|区间合并

news2025/1/17 4:01:46

目录

双指针算法

位运算 

离散化 

序列合并


 

双指针算法

题目描述:1.输入n个单词,每个单词在输入的时候按空格隔开,之后打印出每个单词且换行

#include<iostream>
#include <string>

using namespace std;
int main()
{
	string arr;
	getline(cin, arr);
	int n = arr.size();
	for (int i = 0; i < n; ++i)
	{
		int j = i;
		while (arr[j] != ' '&&j<n)
		{
			j++;
		}
		for (; i < j; ++i)
		{
			cout << arr[i];
		}
		cout << endl;
		i = j;
	}
	return 0;
}

 

 习题2:最长连续不重复的子序列

#include<iostream>
#include <string>
#include<math.h>
using namespace std;
const int N = 100010;
int arr[N], s[N];
int main()
{

	int n;
	cin >> n;
	int res = 0;
	int i, j;
	for (i = 0; i < n; ++i)
		cin >> arr[i];
	for (i = 0,j = 0; i<n; ++i)
	{
		s[arr[i]]++;
		while (s[arr[i]]!=1)
		{
			s[arr[j]]--;
			j++;
		}
		res = max(res, i - j + 1);
	}
	cout << res;
	return 0;
}

位运算 

 lowbit(x),返回x的最后一位1,起始就是x&-x=x&(~x+1)

习题:求二进制中1的个数

 

#include<iostream>
#include <string>
#include<math.h>
using namespace std;
int lowbit(int x)
{
	return x & -x;
}
int main()
{
	int n;
	cin >> n;
	int x;
	
	while (n--)
	{
		int res = 0;
		cin >> x;
		while (x)//x若为0则说明没有1了,每次减去一个1,直到减把1减光为止
		{
			x = x - lowbit(x);//每次减去一个1,直到减把1减光为止
			res++;//res统计一个个数
		}
		cout << res<< ' ';
	}
	return 0;
}

 也可这样计算

int main()
{
	int n;
	cin >> n;
	int x;

	while (n--)
	{
		int res = 0;
		cin >> x;
		for (int i = 0; i < 32; ++i)
		{
			if ((x >> i) & 1 == 1)
				res++;
		}
		cout << res << ' ';
	}
	return 0;
}

离散化 

 unique函数本质是将重复的元素移动到数组的末尾,最后再将迭代器指向第一个重复元素的下标。

离散化:一般是在一个的数组中,输入x(下标),将该值映射到从1开始对应的数组

如这里要给上面数组下标为2的值离散化,离散化之后对应的下标为3

思路:先用sort函数排序,然后用unique去重,再删除重复元素,用二分查找找下标,找到返回即可 

 

 

一开始数字全是0,下标为1的数+2,为3的数+6,为7的数+5,计算0-3的和,4-6的和 。7-8的和

思路:把所有加了 值的数,映射到从一开始的数组即可

有n行,所以是10的5次方个数,对于m行要输入俩个整数lr,这里又是2x10的5次方,所以总共是3x10的5次方,总共有2x10的9次方个数,但是我们只用到了3x10的5次方个数

#include<iostream>
#include<vector>
#include<algorithm>

typedef pair<int, int> PII;
const int N = 300010;
int n, m;//都代表行数n是x+c的行数,m是区间函数l,r
int a[N], s[N];//a数组用来存离散后的数x对应数字+c后的值,但这个数组是从1开始与x相对应的,若之前x是0,在这个数组中就为1,s是前缀和
vector<int> alls;//存所有要离散化的值(这个数组里存的是下标)
vector<PII> add,query;//add是给x+c对应x,c的键值,query存放要离散化的左右区间
using namespace std;
int find(int x)
{
	int l = 0, r = alls.size()-1;
	while (l < r)
	{
		int mid = (l + r) / 2;
		if (alls[mid] >= x)
		{
			r = mid;
		}
		else
			l = mid + 1;
	}
	return r+1;//由于映射的是从1开始映射,所以给r+1。
}
int main()
                              {
	cin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		int x, c;
		cin >> x >> c;
		add.push_back({ x,c });
		alls.push_back(x);
	}
	for (int i = 0; i < m; ++i)
	{
		int l, r;
		cin >> l >> r;
		query.push_back({l,r});//l,r是下标
		alls.push_back(l);//由于l,r是下标,所以也要离散化成对应的数字
		alls.push_back(r);
	}
	//给alls数组去重
	sort(alls.begin(), alls.end());
	alls.erase(unique(alls.begin(),alls.end()));//删除重复元素
	//处理插入:x下标对应数字+c后具体的值
	for (auto item : add)//add中存的是x,c对应的键值
	{
		int x = find(item.first);//先找到离散化之后的值
		a[x] += item.second;//a是从下标1开始对应x
	}
	//预处理前缀和
	for (int i = 1; i <= alls.size(); ++i)
	{
		s[i] = s[i - 1] + a[i];
	}
	//处理询问
	for (auto item : query)
	{
		int l = find(item.first);//将l离散化后找到具体对应的数值
		int r = find(item.second);
		cout << s[r] - s[l - 1] << endl;//计算区间和
	}
	return 0;
}

序列合并

如果俩段区间有交集,就将这俩段区间合并 

绿色为合并后的区间

 思路:按区间左端点排序(每个区间都有自己的左端点,根据左端点的大小进行排序),扫描整个区间,扫描过程当中把有交集的区间进行合并。

不会出现红色这种情况,因为我们对左端点按照从小到大的顺序进行了排列

当第一个区间合并完之后,开始进行合并下一个区间更新start和end的位置 

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
using namespace std;
const int N = 100010;
typedef pair<int, int> PII;
vector<PII> segs;//存所有的区间
void merge(vector<PII>& segs)
{
	vector<PII> res;//存放合并后的区间
	sort(segs.begin(), segs.end());//先把所有区间排序,pair排序优先以左端点排序,再以又端点排序
	int st = -2e9, ed = -2e9;//刚开始区间的大小,2*10的-9次方
	for (auto seg : segs)//从前往后扫描所有的区间
	{
		if (seg.first > ed)//如果这个区间左边的数大于上一个区间的最后一个数字,说明没有交集
		{
			if (st != -2e9)//这个区间如果不是最开始的初始区间就放入res中
			{
				res.push_back({ st,ed });
			}
				st = seg.first, ed = seg.second;//更新st和ed,让st和ed跟下一个区间进行比较
		}
		else//此时有了交集,把右端点更新成最长的哪个
		{
			ed = max(seg.second, ed);
		}
	}
	if (st != -2e9)//防止输入一个空区间
	{
		res.push_back({ st, ed });//如果不是空区间,就把最后一个区间放进去
	}

	segs = res;
}
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i)
	{
		int l, r;
		cin >> l >> r;
		segs.push_back({ l,r });
	}
	merge(segs);//进行区间合并
	cout << segs.size() << endl;
	return 0;
}

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

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

相关文章

计算机网络中的原码、反码、补码

写在前面 原码、反码、补码是计算机组成原理中的概念&#xff0c;是计算机网络的基础知识之一。这些概念是为了处理二进制数的符号位而引入的&#xff0c;常用于计算机中的整数运算&#xff0c;也常用于数据存储和传输等领域。因此&#xff0c;了解和掌握这些概念对于理解计算机…

软测入门(五)接口测试Postman

Postman 一款Http接口收工测试工具。如果做自动化测试会使用jemter做。 安装 去官网下载即可。 https://www.postman.com/downloads/?utm_sourcepostman-home 功能介绍 页面上的单词基本上都能了解&#xff0c;不多介绍。 转代码&注释 可将接口的访问转为其他语言的…

一款小巧、开源免费、可观性强的流量监控软件——TrafficMonitor

名人说&#xff1a;君子生非异也&#xff0c;善假于物也。——荀子 Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着步骤一步步尝试安装吧。✧ 目录背景缘由一、…

自动驾驶目标检测项目实战(一)—基于深度学习框架yolov的交通标志检测

自动驾驶目标检测项目实战——基于深度学习框架yolov的交通标志检测 目前目标检测算法有很多&#xff0c;流行的就有faster-rnn和yolov&#xff0c;本文使用了几年前的yolov3框架进行训练&#xff0c;效果还是很好&#xff0c;当然也可以使用更高版本的Yolov进行实战。本代码使…

分布式事务之TCC与SAGA

分布式事务之TCC与SAGA 在《关于分布式事务的理解》&#xff0c;介绍了可靠消息队列的实现原理&#xff0c;虽然它也能保证最终的结果是相对可靠的&#xff0c;过程也足够简单&#xff08;相对于 TCC 来说&#xff09;&#xff0c;但现在你已经知道&#xff0c;可靠消息队列的…

从零起步认识XAML

新建WPF项目 在Visual Studio 2022中&#xff0c;选择"创建新项目" 选择“WPF Application” 点击下一步 点击创建。 执行DebugStart Debugging菜单命令&#xff0c;或者快捷键为F5&#xff0c;或者工具栏上的图标。 在Solution Explorer窗口&#xff08;ViewSoluti…

smardaten应用商超 | 邀您沉浸式体验企业级无代码开发

宝子们&#xff0c;还在发愁登录smardaten后缺少模板和数据吗&#xff1f;从0到1构建完整应用费时费力&#xff1f;别急&#xff0c;一大波模板资源已经装上车&#xff0c;这就给你安排上&#xff01;【smardaten应用商超】基于数睿数据长期服务软件企业、大型客户的经验&#…

Redis实现服务注册与服务发现源码阅读(Go语言)

Redis实现服务注册与服务发现源码阅读 背景 近期在看开源项目CloudWeGo中看到目前GoLang微服务框架Hertz中支持通过Redis实现服务注册与服务发现功能。便想着阅读下源码 源码阅读 gut clone了hertz-contrib后看到在一级目录下有目前各种主流的服务注册与发现的实现方案。为…

【数据结构初阶】二叉树顺序结构:堆的实现

前言 前边077带着大家学习了树与二叉树的相关概念&#xff0c;这篇文章我们来实现一个二叉树的顺序结构。 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉…

SQL注入基础入门篇 注入思路及常见的SQL注入类型总结

SQL注入基础入门篇1. SQL注入的概念1.1 什么是SQL注入&#xff1f;1.2 注入过程1.3 SQL注入的分类2. 注入思路3. 第一次注入3.1 寻找注入点3.2 构造攻击语句3.2.1 数据出在哪里&#xff1f;3.2.2 怎么有序的获取核心数据&#xff1f;3.2.2.1 基础信息查询3.2.2.2 表名&#xff…

TCP三次握手与四次挥手(一次明白)

TCP基本信息 默认端口号:80 LINUX中TIME_WAIT的默认时间是30s TCP三次握手 三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态 客户端服务端客户端状态服务端状态握手前CLOSELISTEN客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN二次握手服务端发送…

Java项目(一些注解、依赖

文章目录常用的几个注解DataAllArgsConstructorNoArgsConstructorSetterGetterEqualsAndHashCodeLog4j/Slf4jMYBatis-Plus常用注解TableNameTableIdTableFieldTableLogicMapperMapperMapperScanpom.xml中加入依赖创建项目常用的几个注解 Data 注在类上&#xff0c;提供类的ge…

cv2.addWeighted 操作 np.array 踩坑记录

cv2.addWeighted函数是把两张图片img1, img2达到融合的效果&#xff0c; 看官网的解释&#xff0c;下图中f0和f1代表两张图片&#xff0c; 用法是这样的 import cv2alpha 0.6 beta (1.0 - alpha)src1 cv2.imread("img1.jpg") src2 cv2.imread("img2.jpg&q…

MQ-2烟雾传感器模块功能实现(STM32)

认识MQ-2模块与其工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半导体。当处于200~300摄氏度时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&#xff0c;从而使其电阻值增加。…

【C语言复习】C语言中的数组与指针

数组与指针复习写在前面数组和指针指针基础概念进阶知识指针的分类指针和数组笔试题写在前面 数组和指针小节&#xff0c;主要分为以下关键点&#xff1a; 常见指针分类&#xff0c;如指针数组、数组指针、函数指针等。什么是数组/ 指针有关数组和指针的题目数组传参 我们也…

写字楼/园区/购物中心空置率太高?快用快鲸智慧楼宇系统

客户租不租你的写字楼&#xff0c;事关区位、交通、环境、价格、面积、装修等诸多因素&#xff0c;但很多招商部对这些影响客户决策的数据并不重视&#xff0c;在客户初次上门看房时仅简单记录姓名、联系方式、需求面积&#xff0c;对其他核心数据熟视无睹&#xff0c;也为日后…

第十三届蓝桥杯

这里写目录标题一、刷题统计&#xff08;ceil函数返回的是等值于某最小整数的浮点值&#xff0c;不强制转换回int就wa&#xff0c;没错就连和int整数相加都wa二、修剪灌木&#xff08;主要应看清楚会调转方向三、统计子矩阵&#xff08;前缀和滑动窗口⭐&#xff09;四、[积木画…

【算法】笔记:LeetCode 206. 反转链表

文章目录前言思考问题&#xff1a;把分开的节点连在一起结合原题&#xff1a;使用[迭代]解决卡点引入新指针边界条件代码反转的逻辑代码&#xff08;完整答案&#xff09;结合原题&#xff1a;使用[递归]解决卡点完整代码问题的子问题当前层要干什么递归出口前言 这道题可以拆…

冰箱压缩机 方案

压缩机是制冷系统的心脏&#xff0c;它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为制冷循环提供动力&#xff0c;从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…

C#开发的OpenRA的游戏主界面怎么样创建

通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存, 但是这些数据怎么显示出来,又是没有定义的。比如前面定义了多个界面的布局, 又是怎么样知道需要显示哪一个界面? 现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的, 所以我们需要从yaml…