【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序

目录

一、iota函数

1. 函数解析

​①  迭代器类型(补充)

② 头文件

③  参数

2. 函数用途与实例

二、sort函数

1、 函数解读

2、实现倒序排列

2.1 greater 与 less 模板参数

2.2  lambda表达式

三、下标绑定排序(zip) --- 833.字符串中的查找与替换


一、iota函数

1. 函数解析

①  迭代器类型(补充)

ForwardIterator :ForwardIterator为正向迭代器,它只支持加操作不支持减操作;

② 头文件

#include <numeric>      // std::iota

③  参数

first:第一个参数是指向区间中的第一个位置的迭代器

last:第二个参数是指向区间最后一个位置的后一个位置的迭代器,也就一个左闭右开的区间

val:第三个参数传入区间第一个位置的值 

2. 函数用途与实例

将首元素为val,公差为1的连续递增序列依次分配给区间 [first, last) 

#include<iostream>
#include<vector>
#include <numeric>      // std::iota
int main()
{std::vector<int> v(10);//分别将 0 1 2 3 4 5 6 7 8 9 填入区间 [ v.begin(), v.end() )std::iota(v.begin(), v.end(), 0);for (auto x : v) std::cout << x << ' ';std::cout << std::endl;int arr[10];std::iota(arr, arr + 10, 0);for (auto x : arr) std::cout << x << ' ';return 0;
}

二、sort函数

 1、 函数解读

① 函数实现了默认升序对一个左闭右开的区间 [first, last) 进行排序

② 可通过仿函数重载operator< 或operator> 实现自定义数据排序

③ sort函数底层实现为快速排序,即为不稳定排序,等效元素相对位置可能会发生改变,若要实现稳定排序,可以使用stable_sort函数

2、实现倒序排列

2.1 greater 与 less 模板参数

#include<iostream>
#include<vector>
#include<algorithm>     //sort函数的头文件
#include<functional>    //greater算法的头文件
int main()
{std::vector<int> v = {3, 2, 6, 1, 8, 5, 2, 6};std::sort(v.begin(), v.end(), std::greater<int>());for (auto x : v) std::cout << x << ' ';return 0;
}

2.2  lambda表达式

#include<iostream>
#include<vector>
#include<algorithm>     //sort函数的头文件
#include <numeric> using namespace std;
int main() {vector<int> id(10);// 0 1 2 3 4 5 6 7 8 9iota(id.begin(), id.end(), 0);// 9 8 7 6 5 4 3 2 1 0sort(id.begin(), id.end(), [&](int i, int j) {return id[i] > id[j]; });for (auto x : id) cout << x;return 0;
}

三、下标绑定排序(zip) --- 833.字符串中的查找与替换

你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indicessources,  targets

要完成第 i 个替换操作:

  1. 检查 子字符串  sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。
  2. 如果没有出现, 什么也不做 。
  3. 如果出现,则用 targets[i] 替换 该子字符串。

例如,如果 s = "abcd" , indices[i] = 0 , sources[i] = "ab", targets[i] = "eee" ,那么替换的结果将是 "eeecd" 。

所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 

  • 例如,一个 s = "abc" ,  indices = [0,1] , sources = ["ab","bc"] 的测试用例将不会生成,因为 "ab" 和 "bc" 替换重叠。

在对 s 执行所有替换操作后返回 结果字符串 。

子字符串 是字符串中连续的字符序列。

示例 1:

输入:s = "abcd", indices = [0,2], sources = ["a","cd"], targets = ["eee","ffff"]
输出:"eeebffff"
解释:
"a" 从 s 中的索引 0 开始,所以它被替换为 "eee"。
"cd" 从 s 中的索引 2 开始,所以它被替换为 "ffff"。

解题思路:由于前面的字符替换可能使字符串下标发生改变,所以考虑从后往前替换字符串s,即从大到小遍历indices的数,并将下标从indices[i]开始长度为sources[i].size()的s的字串与sources[i]比较,若相等,则特换成targets[i]

法一  下标数组:

为实现从大到小遍历indices的数,若直接用sort函数排序,那么原本的indices[i]就不对应sources[i]了,我们可以通过定义indices的下标数组,在以indices的值进行倒序排列;

class Solution {
public:string findReplaceString(string s, vector<int>& indices, vector<string>& sources, vector<string>& targets) {int n = indices.size();vector<int> id(n);iota(id.begin(), id.end(), 0);sort(id.begin(), id.end(), [&](int i, int j)  {return indices[i] > indices[j];});for (auto i : id) {    //i为indices倒序之后的下标int j = indices[i], len = sources[i].size();if (s.substr(j, len) == sources[i]) {s.replace(j, len, targets[i]);}}return s;}
};

法二  tuple:

直接将indices[i], sources[i], targets[i]通过tuple“打包”,再通过indices[i]倒序排列

class Solution {
public:string findReplaceString(string s, vector<int>& indices, vector<string>& sources, vector<string>& targets) {int n = indices.size();vector<tuple<int, string, string>> zip;for (int i = 0; i < n; i++) zip.push_back({indices[i], sources[i], targets[i]});sort(zip.begin(), zip.end(), greater<tuple<int, string, string>>());for (auto& [i, source, target] : zip) {    int len = source.length();if (s.substr(i, len) == source) {s.replace(i, len, target);}}return s;}
};

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

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

相关文章

ABC 258 G Triangle(bitset 优化)

ABC 258 G Triangle(bitset 优化) ABC 258 G Triangle 大意&#xff1a;给出一个邻接矩阵 &#xff0c;用来记录两两元素间是否连接 &#xff0c; 计算其中三元环的数目。 思路&#xff1a; 不妨先想暴力解法 for(int i 1 ; i < n ; i ){for(int j i 1 ; j < n ;…

ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序&#xff0c;特记录一下过程 环境&#xff1a;ubuntu18.04ros melodic 小知识&#xff1a;GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA&#xff0c;不必删除之前的CUDA&#xff0c;…

微服务Feign组件远程调用自定义解码器

Feign远程调用响应结果格式 public class Result<T> {/*** 响应码&#xff0c;200为成功*/private Integer code;/*** 响应信息*/private String message;/*** 响应的具体对象*/private T data; }自定义Feign解码器 Component // 注入Spring的IOC容器中&#xff0c;所有…

Java快速入门体验

Java快速入门体验 一、环境信息1.1 硬件信息1.2 软件信息 二、Maven安装2.1 Maven介绍2.2 Maven安装包下载2.3 Maven安装2.4 Maven初始化 三、Java安装3.1 JDK下载3.2 JDK安装3.3 JDK初始化 四、开发环境搭建4.1 安装开发工具4.2 关联Maven环境4.2.1 新建JAVA项目4.2.2 Maven与…

DataWhale夏令营第三期-CV赛道-第三次打卡

第三次打卡 使用resnet18训练精度&#xff1a;评分0.74 使用resnet34精度&#xff1a;评分0.74 使用resnet50精度&#xff1a;评分0.21&#xff0c;不知道为什么网络层数高反而准确度下降&#xff0c;猜测层数多丢失了一些特征信息。

2023年国赛 高教社杯数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

Mysql数据库技术知识整理

Mysql的知识点目录 重点&#xff1a;架构,引擎,索引&#xff0c;锁机制,事务机制,日志机制&#xff0c;集群,调优 3、Mysql索引 索引概念 覆盖索引&#xff1a; 条件列和结果列都在索引中索引下推&#xff1a; 查询会先过滤条件列&#xff0c;然后回表查数据最左前缀匹配&am…

FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

目录 一、简介 二、BeanFactory 三、FactoryBean 四、区别 五、使用场景 总结 一、简介 在Spring框架中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;容器是一个核心组件&#xff0c;它负责管理和配置Java对象及其依赖关系&#xff0c;实现了控制反转&a…

lazy初始化和懒加载(Lazy Loading)

lazy初始化 lazy初始化指的是在需要时才进行对象的初始化&#xff0c;而不是在声明或加载时立即初始化。这种延迟初始化的方式可以提高程序的性能和效率&#xff0c;特别是在对象较大或者初始化较慢的情况下。 在很多编程语言中&#xff0c;我们可以使用各种技术来实现lazy初…

如何理解原假设和备择假设?

原假设H0&#xff1a;一般是想要推翻的结论&#xff0c;如指标没有变化&#xff0c;实验组和对照组的该结果指标没有差异等。 备择假设H1&#xff1a;一般是想要证明的结论&#xff0c;如实验组的指标是显著提升的&#xff0c;指标提升10%等。 反证法的思想&#xff1a;因为假…

CDH集群离线配置python3环境,并安装pyhive、impyla、pyspark

背景&#xff1a; 项目需要对数仓千万级数据进行分析、算法建模。因数据安全&#xff0c;数据无法大批量导出&#xff0c;需在集群内进行分析建模&#xff0c;但CDH集群未安装python3 环境&#xff0c;需在无网情况下离线配置python3环境及一系列第三方库。 采取策略&#xf…

【UniApp开发小程序】私聊功能uniapp界面实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

文章目录 效果显示WebSocket连接使用全局变量WebSocket连接细节 最近和自己聊天的用户信息界面效果界面代码最近的聊天内容太长日期时间显示未读消息数量显示 私聊界面界面展示代码实现英文长串不换行问题聊天区域自动滑动到底部键盘呼出&#xff0c;聊天区域收缩&#xff0c;聊…

报错:1 字节的 UTF-8 序列的字节 1 无效。

这里我的问题出现在BookMapper.xml中 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)at org.spring…

Hbase--技术文档--单机docker基础安装(非高可用)

环境准备-docker 配置Linux服务器华为云耀云服务器之docker安装&#xff0c;以及环境变量安装 java &#xff08;虚拟机一样适用&#xff09;_docker配置java环境变量_一单成的博客-CSDN博客 说明&#xff1a; 本文章安装方式为学习使用的单体hbase项目。主要是学习&#xff…

Unity之用Transform 数组加多个空物体-->简单地控制物体按照指定路线自动行驶

文章目录 **原理解释**&#xff1a;**带注释的代码**&#xff1a;实际运用 当你需要实现物体按照指定路线行驶时&#xff0c;你可以通过以下步骤来实现&#xff1a; 原理解释&#xff1a; 路径点&#xff1a;你需要定义一系列路径点&#xff0c;这些点将构成物体行驶的路线。每…

双指针算法总结

双指针算法大致有以下几个类型 对撞指针&#xff1a;一般用来处理两数和问题快慢指针&#xff1a; 一般在链表中用的比较多&#xff0c;如求链表中间结点&#xff0c;链表是否有环等&#xff0c;当然一些非链表题也会用到相关的思想区间划分&#xff1a; 将数组分成两个不同性质…

next.js报错点

next.js报错点 1.类型“{ children: ReactNode; }”与类型“IntrinsicAttributes”不具有相同的属性。2. 不能将类型“void[]”分配给类型“ReactNode”&#xff1f;3.useRouter only works in Client Components. Add the "use client" directive at the top of the…

【LeetCode 】数组简介

集合列表和数组 本文中介绍的概念为适用于所有编程语言的抽象理论&#xff0c;具体实现会由编程语言的不同而稍有差别。 具体介绍数组之前&#xff0c;我们先来了解一下集合、列表和数组的概念之间的差别。 集合 集合一般被定义为&#xff1a;由一个或多个确定的元素所构成的…

AE各个版本号对应

用于版本转换 2007年7月 After Effects CS3&#xff08;After Effects 8.0&#xff09; 2008年9月 After Effects CS4&#xff08;After Effects 9.0&#xff09; 2011年4月 After Effects CS5&#xff08;After Effects 10.0&#xff09; 2012年4月 After Effects CS6&…

TypeScript封装Axios

TypeScript封装Axios Axios的基本使用 因axios基础使用十分简单&#xff0c;可参考axios官方文档&#xff0c;这里不在介绍他基本用法&#xff0c;主要讲解拦截器。 拦截器主要分为两种&#xff0c;请求拦截器和响应拦截器。 请求拦截器&#xff1a;请求发送之前进行拦截&…