数组a[100]中有100个整形数,这些数是0到999中选出来的,其中只有两个数相同,求实现函数,注意空间复杂度和时间复杂度。。。。。求教大神,这个题要考什么?

landaship 2013-07-12 06:01:28
如题,某公司笔试题,看了半天不知道怎么做了,就因为要考虑复杂度的问题,不知道他要考察什么?
...全文
646 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2013-07-13
  • 打赏
  • 举报
回复
bool x[1000] 占的内存空间嫌大的话, 还可以用 std::bitset<1000>, 占用 128 个字节....
你怎么了熊吉 2013-07-13
  • 打赏
  • 举报
回复
引用 17 楼 landaship 的回复:
无语,是不是直接第一个往后挨个比较呢,不过时间复杂就是o(100平方 )?对不对呢,不晓得啊。。
怎么会呢,只读一遍啊,读到一个数就把bool[x]置true,然后一出现重复的就能终止了
  • 打赏
  • 举报
回复
哪用那么麻烦,从1+到1000,然后求S(a)和S(1000)的差不就知道了
qqw请问 2013-07-13
  • 打赏
  • 举报
回复
确实是说的从0到999中取,也就是1000个数,那个只有100位的类似的题目我看过,跟您说的那个方法类似,但是如果是1000个数就不管用了。。。
landaship 2013-07-13
  • 打赏
  • 举报
回复
引用 21 楼 net_assassin 的回复:
//数组a[100]中有100个整形数,这些数是0到999中选出来的,其中只有两个数相同,求实现函数,注意空间复杂度和时间复杂度
#define  SizeOfSet 1000
int sameValue(int *a, int size)
{
	//bitset
	bitset<SizeOfSet> num;        //创建bitset ,1000位 都为0
	
	for (int i = 0; i < size; i++)//遍历a数组
	{
		if(num.test(a[i]))    //第二次出现,就是它了
		{
			return a[i];
		}
		num.set(a[i]);        //第一次出现,置1
	}
	return 0;                     //这个返回并不是真的重复0值,而是出于怕输入有误导致没有返回值程序出错我才加上的。 
}
用bitset来做,不用排序乱遭的,直接遍历,题目都给你了0-1000这个信息了,意图很明了了。HR就是想看你会不会这个 时间复杂度 最坏 O(100) 最好 O(2) 空间复杂度 O(1000/8)
哦,明白了,谢谢了
net_assassin 2013-07-13
  • 打赏
  • 举报
回复
//数组a[100]中有100个整形数,这些数是0到999中选出来的,其中只有两个数相同,求实现函数,注意空间复杂度和时间复杂度
#define  SizeOfSet 1000
int sameValue(int *a, int size)
{
	//bitset
	bitset<SizeOfSet> num;        //创建bitset ,1000位 都为0
	
	for (int i = 0; i < size; i++)//遍历a数组
	{
		if(num.test(a[i]))    //第二次出现,就是它了
		{
			return a[i];
		}
		num.set(a[i]);        //第一次出现,置1
	}
	return 0;                     //这个返回并不是真的重复0值,而是出于怕输入有误导致没有返回值程序出错我才加上的。 
}
用bitset来做,不用排序乱遭的,直接遍历,题目都给你了0-1000这个信息了,意图很明了了。HR就是想看你会不会这个 时间复杂度 最坏 O(100) 最好 O(2) 空间复杂度 O(1000/8)
landaship 2013-07-12
  • 打赏
  • 举报
回复
无语,是不是直接第一个往后挨个比较呢,不过时间复杂就是o(100平方 )?对不对呢,不晓得啊。。
你怎么了熊吉 2013-07-12
  • 打赏
  • 举报
回复
引用 14 楼 landaship 的回复:
引用 9 楼 czarten 的回复:
直觉告诉我这个可以O(N)
呃。。。。面试官会对你说,直觉告诉我你被淘汰了。。。
不能直接用个bool[1000]吗?空间用的太多?
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
引用 12 楼 czarten 的回复:
[quote=引用 11 楼 adlay 的回复:] [quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
什么地方说的是 1000 个数?[/quote] 这些数是0到999中选出来的[/quote] 是我看错了
landaship 2013-07-12
  • 打赏
  • 举报
回复
引用 9 楼 czarten 的回复:
直觉告诉我这个可以O(N)
呃。。。。面试官会对你说,直觉告诉我你被淘汰了。。。
landaship 2013-07-12
  • 打赏
  • 举报
回复
引用 11 楼 adlay 的回复:
[quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
什么地方说的是 1000 个数?[/quote]确实是说的从0到999中取,也就是1000个数,那个只有100位的类似的题目我看过,跟您说的那个方法类似,但是如果是1000个数就不管用了。。。
你怎么了熊吉 2013-07-12
  • 打赏
  • 举报
回复
引用 11 楼 adlay 的回复:
[quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
什么地方说的是 1000 个数?[/quote] 这些数是0到999中选出来的
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
引用 10 楼 czarten 的回复:
一共不是1000个数么……
什么地方说的是 1000 个数?
你怎么了熊吉 2013-07-12
  • 打赏
  • 举报
回复
引用 7 楼 adlay 的回复:
一共 100 个数, 100 个位置, 重复了一个, 必然还会缺少一个. 我们假设重复的为 x, 缺少的为 y, 试试下面的算法: 先计算两个常量值, 0 + 1 + 2 + 3 + ... + 99 = A 0 ^ 1 ^ 2 ^ 3 ^ ... ^ 99 = B 然后我们把数组中所有元素相加得到 X, 数组中所有元素进行异或的到 Y. 那么 A + x - y = X 由于两个相同的数异或等于 0 所以 Y 中 x 异或了两次等于没有, 于是: Y ^ x ^ y = B 上面的 A, B, X, Y 都是已知的了, 我们就可以得到下面的方程组, 其中 a, b 是分别等于 X - A, B ^ Y 的已知量. x - y = a x ^ y = b 两个未知数, 两个变量, 解这个二元一次方程组及可以获得 x, y 的值. y 就是程序要找的值.
一共不是1000个数么……
你怎么了熊吉 2013-07-12
  • 打赏
  • 举报
回复
直觉告诉我这个可以O(N)
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
更正: y 就是程序要找的值. -> x 就是程序要找的值.
www_adintr_com 2013-07-12
  • 打赏
  • 举报
回复
一共 100 个数, 100 个位置, 重复了一个, 必然还会缺少一个. 我们假设重复的为 x, 缺少的为 y, 试试下面的算法: 先计算两个常量值, 0 + 1 + 2 + 3 + ... + 99 = A 0 ^ 1 ^ 2 ^ 3 ^ ... ^ 99 = B 然后我们把数组中所有元素相加得到 X, 数组中所有元素进行异或的到 Y. 那么 A + x - y = X 由于两个相同的数异或等于 0 所以 Y 中 x 异或了两次等于没有, 于是: Y ^ x ^ y = B 上面的 A, B, X, Y 都是已知的了, 我们就可以得到下面的方程组, 其中 a, b 是分别等于 X - A, B ^ Y 的已知量. x - y = a x ^ y = b 两个未知数, 两个变量, 解这个二元一次方程组及可以获得 x, y 的值. y 就是程序要找的值.
landaship 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 starytx 的回复:
排序,然后挨个和下一个比较
这样时间复杂度会不会比较高?
landaship 2013-07-12
  • 打赏
  • 举报
回复
引用 2 楼 nice_cxf 的回复:
基数排序+位图,时间复杂度o(100),空间为o(1000/8)
请问你是说这道题考察的是排序和位图?
landaship 2013-07-12
  • 打赏
  • 举报
回复
嗯,题目没有写完不好意思,就是要实现查找这两个相同的数的函数,然后注意复杂度
加载更多回复(3)

64,701

社区成员

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

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