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