谁能搞定这个笔试题,用vector的!

hellogiti 2009-03-20 07:10:33
问题:
两个整数的数组 VectorA,VectorB由任意的整数构成。
假设2个数组里的整数都是唯一的(没有重复的整数)。
要求,将两个数组中相同的整数提出放到数组VectorC里。
*考虑到数组很大,要求用速度尽量快的算法。

#include "stdafx.h"
#include <vector>

void MakeVector( const vector<int>& vectorA, const vector<int>& vectorB, vector<int>& vectorC )
{
//make programe here.
}
...全文
248 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq675927952 2009-04-10
  • 打赏
  • 举报
回复
set_intersection 集合的并
黄志义 2009-04-08
  • 打赏
  • 举报
回复
先分别排序 然后比较
比如先分别按从小到大排序 然后把两个数组从头开始比较,值相等则记录,不相等则较小的那个数组下标加1,继续。。。
hongxia1981 2009-04-08
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void MakeVector( const vector <int>& vectorA, const vector <int>& vectorB, vector <int>& vectorC )
{
//make programe here.

int i;
int j;
if (vectorA[0] <= vectorB[0])
{
for (i = 0; i < vectorB.size(); ++i )
{

if (find(vectorA.begin(),vectorA.end(), vectorB[i]) != vectorA.end())
{
vectorC.push_back((*(find(vectorA.begin(),vectorA.end(), vectorB[i]))));
}
}
}

else
{
for (i = 0; i < vectorA.size(); ++i )
{

if (find(vectorB.begin(),vectorB.end(),vectorA[i]) != vectorB.end())
{
vectorC.push_back((*(find(vectorB.begin(),vectorB.end(),vectorA[i]))));
}
}

}

for (i = 0; i < vectorC.size(); ++i)
{
cout<<vectorC[i]<<" ";
}

}


int main()
{

vector <int> vectorA;
vector<int> vectorB;
vector<int> vectorC;

int i;
for (i = 10000; i >= 1; --i)
{
vectorA.push_back(i);
}

sort(vectorA.begin(),vectorA.end());



for (i = 500; i <= 50000; ++i)
{
vectorB.push_back(i);
}

sort(vectorB.begin(),vectorB.end());

MakeVector(vectorA,vectorB,vectorC);
return 0;
}
hylove9494 2009-04-08
  • 打赏
  • 举报
回复
sf
mtyhzhhzh 2009-04-08
  • 打赏
  • 举报
回复
帮顶
zhu_zai_qun 2009-04-06
  • 打赏
  • 举报
回复
把思路简单的给你说一下
第一步先排序VectorA,VectorB.
第二步:
int indexB = 0;
for(int i = 0; i < VectorA.size();)
{
for(;indexB < VectorB.size();)
{
if(VectorA[i] == VectorB[indexB])
{
VectorC.pusp_back[VectorA[i]];
indexB++;
i++;
break;
}
else if(VectorA[i] > VectorB[indexB])
indexB++;
else
{
i++;
break;
}
}
}
Qlaiaqu 2009-03-21
  • 打赏
  • 举报
回复
template <class _InputIter1, class _InputIter2, class _OutputIter>
_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_OutputIter __result) {
__STL_REQUIRES(_InputIter1, _InputIterator);
__STL_REQUIRES(_InputIter2, _InputIterator);
__STL_REQUIRES(_OutputIter, _OutputIterator);
__STL_REQUIRES_SAME_TYPE(
typename iterator_traits<_InputIter1>::value_type,
typename iterator_traits<_InputIter2>::value_type);
__STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
_LessThanComparable);
while (__first1 != __last1 && __first2 != __last2)
if (*__first1 < *__first2)
++__first1;
else if (*__first2 < *__first1)
++__first2;
else {
*__result = *__first1;
++__first1;
++__first2;
++__result;
}
return __result;
}
Qlaiaqu 2009-03-21
  • 打赏
  • 举报
回复
stl有实现交集的算法啊,那个效率就很高了
你自己找找算法的名字
Pikoona 2009-03-21
  • 打赏
  • 举报
回复

如果两个数组很大,且有足够存储空间的话,可以先将VectorA和VectorB排序(用STL算法),再同时步进寻找重复值就好了。
hellogiti 2009-03-20
  • 打赏
  • 举报
回复
谢谢java_lover_ 的解答,
这个程序确实可以实现题目的基本要求,

但是关于如果数组很大,如何提高速度这个目标,
似乎缺乏一点有建设性的提案。

我当时只想到了,
1.VectorA与VectorB,取Size小的那个作为Key;
2.Hit之后记得在较大的数组里删除那个数。

但是其他就想不到了。
wxgiter 2009-03-20
  • 打赏
  • 举报
回复
在vs里建一个工程就会有“stdafx.h".
坚强的豁着 2009-03-20
  • 打赏
  • 举报
回复
stdafx.h这个文件哪里有?
nk_ysg 2009-03-20
  • 打赏
  • 举报
回复
up
java_lover_ 2009-03-20
  • 打赏
  • 举报
回复
我这个行不?

//测试环境vs2003
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;

void initVectorInt(vector<int>& aVector, int seed);
void makeVector(const vector<int>& aVectorA,
const vector<int>& aVectorB,
vector<int>& aVectorC);

int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vectorA;
vector<int> vectorB;
vector<int> vectorC;
initVectorInt(vectorA, 50);
initVectorInt(vectorB, 100);
makeVector(vectorA, vectorB,vectorC);

for(int i = 0; i < vectorA.size(); i++)
{
cout << "vectorA[ " << setw( 3 ) << i << " ] = " << vectorA[i] << endl;
}

cout << "====================" << endl;
for(int i = 0; i <vectorB.size(); i++)
{
cout << "vectorB[ " << setw( 3 ) <<i << " ] = " << vectorB[ i ] << endl;
}

cout << "====================" << endl;
if(vectorC.size() > 0)
for(int i = 0; i <vectorC.size(); i++)
{
cout << "vectorC[ " << setw( 3 ) <<i << " ] = " << vectorC[ i ] << endl;
}

return 0;
}

void initVectorInt(vector<int>& aVector, int seed)
{
srand(seed);
for(int i = 0; i < 100 + rand()%100; i++)
{
aVector.push_back(rand());
}
}

void makeVector(const vector<int>& VectorA,
const vector<int>& VectorB,
vector<int>& VectorC)
{
for(int i = 0 ; i < VectorA.size() ; i ++)
{
for(int j = 0 ; j < VectorB.size() ; j ++)
{
if(VectorA[i] == VectorB[ j ])
{
VectorC.push_back(VectorA[i]);
}
}
}
}
hellogiti 2009-03-20
  • 打赏
  • 举报
回复
没做就想要分?
cnStreamlet 2009-03-20
  • 打赏
  • 举报
回复
接分
lovewwy 2009-03-20
  • 打赏
  • 举报
回复
进来学习
hellogiti 2009-03-20
  • 打赏
  • 举报
回复
其实就是求2个数组的交集,
用Vector写,注意速度。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧