又见tencent面试题

i_noname 2005-11-05 08:32:06
有两个集合
集合A{1,7,19,21,55,100。。。}
集合B{7,22,100。。。}
两个集合都是10万个数据(已排序),要求写一个算法,判断B是不是A的子集,算法时间复杂度为Q(N)
...全文
1365 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
justrun2005 2005-11-08
  • 打赏
  • 举报
回复
从最大的元素开始比较,效果估计会好点。但说回来,这个题弄个o(n)复杂度的一点不难。
不过我想面试的时候,不能仅仅满足题目要求吧?

实践出真知,努力便成功
我的博客:http://blog.csdn.net/justrun2005
zl0126 2005-11-07
  • 打赏
  • 举报
回复
mark
skfox 2005-11-07
  • 打赏
  • 举报
回复
up
sinall 2005-11-07
  • 打赏
  • 举报
回复
呵呵,原来如彼啊。
“两个集合都是10万个数据(已排序)”
insistent_guy 2005-11-07
  • 打赏
  • 举报
回复
#include <iostream>
void main(){
int a[]={1,3,6,8,9,10};
int b[]={3,8,10,11};
int i=0;
int j=0;
//printf("%d",sizeof b);
while(i<sizeof b/sizeof b[0]){
printf("[%d-%d]\n",i,b[i]);
while(j<(sizeof a/sizeof a[0]) && a[j]<b[i]){
j++;
};
printf("%d\n",j);
if(a[j]>b[i]){
printf("b is not a's subset");
break;
} else if (j== sizeof a/sizeof a[0]){
printf("b is not a's subset either");
break;
}
j++;
i++;
}
if(i==sizeof b/sizeof b[0]){
printf("b is a's subset");
}


}
finix 2005-11-07
  • 打赏
  • 举报
回复
最差情况下的复杂度不就是O(N)嘛。遍历一遍就可以了呀,两根指针就解决了
Baku 2005-11-07
  • 打赏
  • 举报
回复
1 有序的集合想不出O(N)的办法只能说明基础太差
2 无序的集合想出O(N)的算法只能说明算法是错的

--------
哈哈,果然经典
楼下的写出O(log N)的算法:)
youzelin 2005-11-07
  • 打赏
  • 举报
回复
好玩,有趣,顶一下先
cg5353 2005-11-07
  • 打赏
  • 举报
回复
和KMP有点类似
batistuta8848 2005-11-07
  • 打赏
  • 举报
回复
学习ing
wuhandong125 2005-11-07
  • 打赏
  • 举报
回复
用折半查找应该可以吧~~
j805 2005-11-07
  • 打赏
  • 举报
回复
一看就知道不是,A中没有22.

^_^,捣个乱.
yjgx007 2005-11-07
  • 打赏
  • 举报
回复
我想应该是一个概率问题
kofkyo 2005-11-06
  • 打赏
  • 举报
回复
szws(克米帅) 的程序似乎不大对~i++应该放在条件外面吧,不然是不是a[i]<b[j]的时候下个循环i的值就是i+2了吧
luoknd 2005-11-06
  • 打赏
  • 举报
回复
1 有序的集合想不出O(N)的办法只能说明基础太差
2 无序的集合想出O(N)的算法只能说明算法是错的

经典
2004csharp 2005-11-06
  • 打赏
  • 举报
回复
szws(克米帅) 支持
yingle2000 2005-11-06
  • 打赏
  • 举报
回复
A和B都已经是完成排序的了,这样只要都遍历一遍就可以了,复杂度为O(N)
szws 2005-11-06
  • 打赏
  • 举报
回复
int i=0;j=0;
for(i=0;i<n;i++)
{
if(a[i]== b[j])
{
i++;j++
}
if(a[i]<b[j])
{
i++;
}
if(a[i]>b[j])
break;
}
szws 2005-11-06
  • 打赏
  • 举报
回复
int i=0;j=0;
for(i=0;i<n;i++)
{
if(a[i]== b[j])
{
i++;j++
}
if(a[i]<b[j])
{
i++;
}
if(a[i]>b[j])
break;
}
lzp729 2005-11-06
  • 打赏
  • 举报
回复
自己先该一下,加点效率
bool detemin (int * const &a, const long &sa, int * const &b, const long &sb)
{
if (!sb) // 高中学的,空集是任何集合的子集
return true;
for (int i = 0; i < sb; ++i)
{
static long pos = 0; // 存储当前遍历到的A的索引值
for (; (*(b+i)) != (*(a+pos)); ++pos)
{
// 如果A的当索引值比B的当前索引值小,或者A剩下的元素比B剩下的少 ...
if ( *(a+pos) < *(b+i) ) || ( (sa - pos) < (sb - i) )
return false;
}
}
return true;
}
加载更多回复(19)

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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