【东华大学oj】顺序表ADT模板简单应用算法设计:在给定的有序顺序表中找出两个元素和为给定值的所有元素对

文章介绍了如何使用自定义顺序表ADT和C++STL的vector模板,设计一个算法在给定的有序整数列表中查找和为特定值的元素对,同时保持原列表顺序。
摘要由CSDN通过智能技术生成

顺序表ADT模板简单应用算法设计:在给定的有序顺序表中找出两个元素和为给定值的所有元素对

时间限制: 1s

类别: DS:线性表->顺序表--简单

问题描述

目的:使用自行设计的顺序表ADT或STL的vector模板设计并实现顺序表应用场合的一些简单算法设计。

应用7:试设计一个算法,找出有序顺序表A(顺序表A中的数据元素的数据类型为int型,非空表,且无重复值)中两个元素和为给定值sum的所有元素对,并保持原顺序表不变。

(1)顺序表ADT版本

参考函数原型:

template<class ElemType>

void Search_Pairs( const SqList<ElemType> &A, int sum );

(2)vector版本

参考函数原型:

template<class ElemType>

void Search_Pairs( const vector<ElemType> &A, int sum );

输入说明

第一行:有序顺序表A的数据元素(数据元素之间以空格分隔)

第二行:给定值sum

输出说明

第一行:顺序表A的遍历结果数据元素之间以“,”分隔)

第二行开始:符合条件的元素对(输出格式见测试数据范例)

                    如无符合条件的元素对,输出"NULL"

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

template<class ElemType>
void Search_Pairs(const vector<ElemType> &A, int sum)
{
    int left = 0, right = A.size() - 1;
    vector<pair<ElemType, ElemType>> pairs;

    while (left < right)
    {
        int currentSum = A[left] + A[right];
        if (currentSum == sum)
        {
            pairs.emplace_back(A[left], A[right]);
            left++;
            right--;
        }
        else if (currentSum < sum)
        {
            left++;
        }
        else
        {
            right--;
        }
    }

    for (size_t i = 0; i < pairs.size(); i++)
    {
        cout << "(" << pairs[i].first << "," << pairs[i].second << ")";
        if (i < pairs.size() - 1)
        {
            cout << ",";
        }
    }

    if (pairs.empty())
    {
        cout << "NULL";
    }
}

int main()
{
    vector<int> A;
    int sum, temp;
    string line;

    getline(cin, line);
    istringstream iss(line);
    while (iss >> temp)
    {
        A.push_back(temp);
    }

    cin >> sum;

    // 打印顺序表A
    for (size_t i = 0; i < A.size(); i++)
    {
        cout << A[i];
        if (i < A.size() - 1) cout << ",";
    }
    cout << endl<<endl;

    Search_Pairs(A, sum);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Juneeeeeeeeeeeee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值