DHU数据结构-顺序表- ADT应用-在给定的有序顺序表中找出两个元素和为给定值的所有元素对

目录

1.题目

2.题解

3.代码实现


1.题目

顺序表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"

输入范例 :

-3 -2 -1 4 5 6
3

输出范例 :

-3,-2,-1,4,5,6

(-3,6),(-2,5),(-1,4)


2.题解

  • 读题:造表(只有int类型,有负数和空表情况,所以如果是自己实现string转为int记得考虑这些限制。如果用stringstream当我没说)+找匹配
  • 造表
  • 找匹配:题解和上一题差不多。枚举或者去优化。不过他是有序顺序表!所以有双指针有用武之地了,当然也可以继续用模拟哈希表哈。

3.代码实现

  • 造表:翻前面的的吧,都一样
  • 找匹配:我发现了,他数据全是升序数据没有降序的,我注释掉的代码是考虑了升序降序两种情况
  • 完整代码
//有顺序考虑双指针
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template<class T>
void print(vector<T> &A)
{
    int i;
    for(i=0; i<A.size()-1; i++)
    {
        cout<<A[i]<<",";
    }
    cout<<A[i]<<endl;
    cout<<endl;
}
template<class T>
void get_pair(vector<T> &A,int N)
{
    print(A);

    typename std::vector<T>::iterator ita=A.begin();
    typename std::vector<T>::iterator itb=A.end();

    vector<int> p1,p2;//p1,p2分别指匹配成功的第一个数和第二个数,作用是方便输出,因为他要带上括号
    while(ita<itb)
    {
        if(*ita+*itb==N)
        {
            p1.push_back(*ita);
            p2.push_back(*itb);
            ita++;
        }
        if(*ita+*itb<N)ita++;
        if(*ita+*itb>N)itb--;
    }
    /*
    vector<int> p1,p2;
    if(A.size()>1&&A[0]<A[1])
    {
        int j=A.size()-1;
        for(int i=0; i<A.size(); i++)
        {
            if(i>=j)
                break;
            while(A[i]+A[j]>N)
                j--;
            if(A[i]+A[j]==N)
                p1.push_back(A[i]),p2.push_back(A[j]);
        }
    }

    else if(A.size()>1&&A[0]>A[1])
    {
        int j=A.size()-1;
        for(int i=0; i<A.size(); i++)
        {
            if(i>=j)
                break;
            while(A[i]+A[j]<N)
                j--;
            if(A[i]+A[j]==N)
                p1.push_back(A[i]),p2.push_back(A[j]);
        }
    }
    */
    if(p1.size()==0)
        cout<<"NULL"<<endl;
    else
    {
        int i;
        for(i=0; i<p1.size()-1; i++)
        {
            cout<<"("<<p1[i]<<","<<p2[i]<<")"<<",";
        }
        cout<<"("<<p1[i]<<","<<p2[i]<<")"<<endl;
    }

}

int main()
{
    int N,num=0,flag=0;
    string s;
    getline(cin,s);
    cin>>N;
    vector<int> a;
    for(int i=0; i<s.size(); i++)
    {
        if(s[i]==' ')
        {
            if(flag==1)
                num=-num;
            a.push_back(num);
            num=0,flag=0;
        }
        else if(s[i]=='-')
            flag=1;
        else
        {
            num=num*10+s[i]-'0';
        }
    }
    if(flag==1)
        num=-num;
    a.push_back(num);
    get_pair(a,N);
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值