标题:一道思科的笔试题
只看楼主
学技术的
Rank: 2
等 级:论坛游民
帖 子:91
专家分:45
注 册:2007-8-5
得分:0 

取出a[0],一个一个的和后面的比较,如果没有相等的就再取出a[1],重复上面的比较。
如果a[i]==a[i+n];return a[i];

大家看看上面的算法行么?在网吧上网的。只能写个思路大家讨论。

2007-08-23 09:47
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 
以下是引用学技术的在2007-8-23 9:47:06的发言:

取出a[0],一个一个的和后面的比较,如果没有相等的就再取出a[1],重复上面的比较。
如果a[i]==a[i+n];return a[i];

大家看看上面的算法行么?在网吧上网的。只能写个思路大家讨论。

我也是在网吧,而且好多功能被锁了


惟有学习不断的学习!
2007-08-23 09:53
学技术的
Rank: 2
等 级:论坛游民
帖 子:91
专家分:45
注 册:2007-8-5
得分:0 
LS的看下算法有问题吗?打算回去写下试试
2007-08-23 10:05
福尔摩斯
Rank: 5Rank: 5
等 级:贵宾
威 望:12
帖 子:4011
专家分:370
注 册:2006-8-15
得分:0 
全是弱智算法!


数组a[N],存放了1至N-1个数

剩下一个数是重复的

那么直接把 1至N-1个数 加起来(等差数列求和),得到 a1

最后把数组 a[N] 的 总和 求出来,得到 a2

重复的数 = a2 - a1

自我放逐。。。
2007-08-23 10:14
酒肉弥勒佛
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:399
专家分:0
注 册:2006-6-6
得分:0 
以下是引用lzyssy在2007-8-22 19:46:36的发言:

//下面是我的算法
void search(int N,int a[])
{
int i,flag;
for(i=0;i<N;i++)
{
flag=a[i]%N;
if(a[flag]<N)
a[flag]+=N;
else
printf("重复的数字为%3d/n",flag);
}
}

//算法没有最好只有更好,请多动脑,想出更好的


能解释下这个算法吗?


编程是为了提高效率,好的程序是因为他的高效;在编程的道路上,永远追逐高效的算法
2007-08-23 10:16
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 
回楼上,4楼的代码是利用a[n]必定<n的特点来做标记
把搜索过的a[i]保存在a[a[i]]上,使用原数据加上n来标记
所以有flag=a[i]%N,以去掉标记得到原数
所以这个算法实质是直接统计,所用的空间是n,只不过直接借用了传递过来的数组。

不过还有一种只要O(1)空间的办法,时间复杂度同样O(n)的

[此贴子已经被作者于2007-8-23 10:34:04编辑过]

2007-08-23 10:27
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 
以下是引用福尔摩斯在2007-8-23 10:14:20的发言:
全是弱智算法!


数组a[N],存放了1至N-1个数

剩下一个数是重复的

那么直接把 1至N-1个数 加起来(等差数列求和),得到 a1

最后把数组 a[N] 的 总和 求出来,得到 a2

重复的数 = a2 - a1

数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字

等差数列求和不好

[此贴子已经被作者于2007-8-23 10:49:07编辑过]


惟有学习不断的学习!
2007-08-23 10:40
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 

恩,可以

[此贴子已经被作者于2007-8-23 10:43:16编辑过]

2007-08-23 10:41
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
得分:0 
回复:(lishizelibin)ls你贴这样多是怎么贴的呀,在...
yes. Editted and tested in VS 2005 and then copy and paste.


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-08-23 10:44
lishizelibin
Rank: 2
等 级:论坛游民
帖 子:513
专家分:41
注 册:2007-5-10
得分:0 
int do_dup(int a[],int N)
{
int temp;
while (a[0]!=a[a[0]])
{
temp = a[0];
a[0] = a[temp];
a[temp] = temp;
}
return a[0];
}
a[0]为监视哨

[此贴子已经被作者于2007-8-23 10:54:48编辑过]


惟有学习不断的学习!
2007-08-23 10:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-164597-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.453034 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved