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

这篇具有很好参考价值的文章主要介绍了【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、iota函数

1. 函数解析

​①  迭代器类型(补充)

② 头文件

③  参数

2. 函数用途与实例

二、sort函数

1、 函数解读

2、实现倒序排列

2.1 greater 与 less 模板参数

2.2  lambda表达式

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


一、iota函数

1. 函数解析

【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序,C++,c++,算法①  迭代器类型(补充)

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

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

② 头文件

#include <numeric>      // std::iota

③  参数

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

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

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

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;
}

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

二、sort函数

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

 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;
}

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

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 9
	iota(id.begin(), id.end(), 0);
	// 9 8 7 6 5 4 3 2 1 0
	sort(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:

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

输入: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数组元素重复的问题,现在这个方法已经不行了,如果给大家带来不便,请谅解)

为实现从大到小遍历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];});
        vector<int> used(s.size(), 0);
        for (auto i : id) {    //i为indices倒序之后的下标
            int j = indices[i], len = sources[i].size();
            if (s.substr(j, len) == sources[i] && !used[j]) {
                s.replace(j, len, targets[i]);
                used[j] = true;
            }
        }
        return s;
    }
};

法二  tuple:

直接将indices[i], sources[i], targets[i]通过tuple“打包”,再通过indices[i]倒序排列文章来源地址https://www.toymoban.com/news/detail-663271.html

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;
    }
};

到了这里,关于【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ sort()函数具体用法

    sort() 函数可以将一个容器或者数组的值进行排序,还可以自定义排序方式。 sort() 是基于头文件 algorithm 库下的一个函数,所以要调用 sort() ,就需要添加头文件。 一.正常排序 我们可以通过写 我们就可以将 arr 中从开始的元素到第5个元素按从小到大的顺序进行排序。 二.排序

    2024年02月06日
    浏览(42)
  • C语言:写一个函数,实现一个整型有序数组的二分查找

    写一个 函数 ,实现一个 整型有序数组 的 二分查找 ,找出 要找的数字 在 数组中对应的下标 。                       =========================================================================                         (一)自定义函数部分:                  (1). 参数: int arr[]

    2024年02月08日
    浏览(48)
  • C++之sort()函数详解,刷题必备~

            顾名思义,sort就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort用起来比较烦琐,涉及很多指针的操作。而且sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到(o

    2024年02月15日
    浏览(40)
  • C++ sort()函数和priority_queue容器中比较函数的区别

    普通的queue是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。 priority_queue中元素被赋予优先级。在创建的时候根据优先级进行了按照从大到小或者从小到大进行了自动排列(大顶堆or小顶堆)。可以以O(log n) 的效率查找一个队列中的最大值或者最小值; 虽然两

    2023年04月09日
    浏览(44)
  • JS中数组随机排序实现(原地算法sort/shuffle算法)

    🐱个人主页: 不叫猫先生 🙋‍♂️作者简介:专注于前端领域各种技术,热衷分享,期待你的关注。 💫系列专栏:vue3从入门到精通 📝个人签名:不破不立 在谈sort之前,我们先了解一下原地算法,什么事原地算法呢?所谓 原地算法 就是说基于原有的数据结构进行一定的

    2023年04月08日
    浏览(42)
  • C++面试八股文:如何实现一个strncpy函数?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官: strcpy 函数使用过吧? 二师兄:用过。 面试官:这个函数有什么作用? 二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。 面试官: strncpy 函数也使用过吧,和 strcpy 有何不同? 二师兄:

    2024年02月11日
    浏览(53)
  • 【第43天】sort 的复杂运用 | 对二维数组与结构体实现自定义排序

    本文已收录于专栏 🌸《Java入门一百练》🌸

    2024年01月17日
    浏览(39)
  • c++——重写(覆盖),实际上对应的就是虚函数

    重写 是指派生类中存在重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

    2024年02月12日
    浏览(42)
  • 【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    1.1 运算符重载【引入】 C++为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为: operator后面接需要重载的运算符符号。 函数原型:

    2024年02月21日
    浏览(48)
  • 定义一个5*5的矩阵(二维数组),赋上初值,通过调用函数实现:将数组中的最大值放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),在主函数中输出变换后的数组。

    程序代码: #includestdio.h int min(int (*a)[5]) {    int i,j,*min,t;    min=a;    for(i=0;i5;i++)    for(j=0;j5;j++)    {    if(*(a[i]+j)*min)     min=(a[i]+j);        //交换地址     }     t=*min;     *min=*(a[0]+0);     *(a[0]+0)=t;         for(i=0;i5;i++)    for(j=0;j5;j++)    {    if(i==0j==0) continue; 

    2024年01月24日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包