64,701
社区成员
发帖
与我相关
我的任务
分享
//数组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)[quote=引用 11 楼 adlay 的回复:] [quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
直觉告诉我这个可以O(N)
[quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
[quote=引用 10 楼 czarten 的回复:] 一共不是1000个数么……
一共不是1000个数么……
一共 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 就是程序要找的值.
排序,然后挨个和下一个比较
基数排序+位图,时间复杂度o(100),空间为o(1000/8)