一道算法题,请高手帮忙

TuringQ 2002-06-21 05:27:01
给定一个数组,内为连续整数{6,4,7,2,1,8,5,9}(未排序),请写出一段优化算法,找出其缺少的那个3。

谁能尽快给个代码呀?
...全文
30 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bamboo2000 2002-06-23
  • 打赏
  • 举报
回复
fireofhell(懒鬼)
不是一般的好,是非常好!!!
LeeMaRS 2002-06-21
  • 打赏
  • 举报
回复
嗯,是不错的方法。
fling_boy 2002-06-21
  • 打赏
  • 举报
回复
fireofhell(懒鬼):好
fireofhell 2002-06-21
  • 打赏
  • 举报
回复
我来说一下我的方法吧:
扫描一遍就可以了,定义四个变量:MIN,MAX用来扫描的同时时候保存这个连续数组的最大,最小值,N用来保存数组元素的个数,SUM累加这个数组的所有的元素的和!那么实际个数就是(MAX-MIN+1)是吧,和就是(MAX+MIN)×(MAX-MIN+1)/2,所以我们要求的数就是MAX+MIN)×(MAX-MIN+1)/2-SUM

上面的情况是针对那个缺的数在连续整数的中间的情况的,在两边的话就跟简单了,就是(MAX+MIN)×(MAX-MIN+1)/2==SUM的情况,随便加个就可以了比如MIN—1,或者MAX+1。

记得给我分啊!!!!
fireofhell 2002-06-21
  • 打赏
  • 举报
回复
to LeeMaRS(小菜虎_水壶的仇人):
如果连续整数很大的话,你的方法就不太好了吧!占用空间了
fling_boy 2002-06-21
  • 打赏
  • 举报
回复
'时间复杂度为O(n)
Public Function FindLostItem(ByRef vItems() As Long, ByVal vSum As Long) As Long
Dim tMax As Long, tMin As Long
Dim i As Long, tmpItem As Long

'找出数组中的最大值
tMax = vItems(1)
For i = 2 To vSum
If tMax > vtiems(i) Then tMax = viems(i)
Next

'找出数组中的最小值并把这一项放到数组的第一元素
tMin = 1
For i = 2 To vSum
If vItems(i) < vItems(tMin) Then tMin = i
Next
tmpItem = vItems(1)
vItems(1) = vItems(tMin)
vItems(tMin) = tmpItem

'从第二个元素开始,元素值等于最大值的除外,每一元素都按顺序放到
'对应的项上,这时最大值会留在缺少的那一项上。
tMin = 2
For i = 2 To vSum
If vItems(tMin) = tMax Then
tMin = tMin + 1
ElseIf vItems(tMin) <> items(1) + i - 1 Then
tmpItem = vItems(vItems(tMin) - vitmes(1) + 1)
vItems(vItems(tMin) - vitmes(1) + 1) = vItems(tMin)
vItems(tMin) = tmpItem
Else
tMin = tMin + 1
End If
Next

'再查找一遍最大值就可以找到了。
For i = 2 To vSum - 1
If tMax = vItems(i) Then
tmpItem = vItems(1) + i - 1
Exit For
End If
Next
FindLostItem = tmpItem


End Function
fling_boy 2002-06-21
  • 打赏
  • 举报
回复
one_add_one()快给分给分_L2002:) :
最小值不一定是1,最大值也不一定是9.
另外数组很大时还会出错。

'时间复杂度为O(n)
Public Function FindLostItem(ByRef vItems() As Long, ByVal vSum As Long) As Long
Dim tMax As Long, tMin As Long
Dim i As Long, tmpItem As Long

'找出数组中的最大值
tMax = vItems(1)
For i = 2 To vSum
If tMax > vtiems(i) Then tMax = viems(i)
Next

'找出数组中的最小值并把这一项放到数组的第一元素
tMin = 1
For i = 2 To vSum
If vItems(i) < vItems(tMin) Then tMin = i
Next
tmpItem = vItems(1)
vItems(1) = vItems(tMin)
vItems(tMin) = tmpItem

'从第二个元素开始,元素值等于最大值的除外,每一元素都按顺序放到
'对应的项上,这时最大值会留在缺少的那一项上。
tMin = 2
For i = 2 To vSum
If vItems(tMin) = tMax Then
tMin = tMin + 1
ElseIf vItems(tMin) <> items(1) + i - 1 Then
tmpItem = vItems(vItems(tMin) - vitmes(1) + 1)
vItems(vItems(tMin) - vitmes(1) + 1) = vItems(tMin)
vItems(tMin) = tmpItem
Else
tMin = tMin + 1
End If
Next

'再查找一遍最大值就可以找到了。
For i = 2 To vSum - 1
If tMax = vItems(i) Then
tmpItem = vItems(1) + i - 1
Exit For
End If
Next
FindLostItem = tmpItem


End Function
LeeMaRS 2002-06-21
  • 打赏
  • 举报
回复
...1+1,你行...
one_add_one 2002-06-21
  • 打赏
  • 举报
回复
时间复杂度为O(N)
空间复杂度为1
one_add_one 2002-06-21
  • 打赏
  • 举报
回复
上面这个算法是用位实现的,非常快:)
one_add_one 2002-06-21
  • 打赏
  • 举报
回复
main(){
int i;
int p[10]={6,4,7,2,1,8,5,9};
long a=(1<<9)-1;
for (i=0;i<8;i++)
a-=1<<(p[i]-1);
for (i=0;i<9;i++)
if (a & (1<<i))
printf("%d\n",i+1);
}
toulouse 2002-06-21
  • 打赏
  • 举报
回复
hammer_shi(搜索专家) 好像没有LeeMaRS(小菜虎_水壶的仇人) 的快!!
toulouse 2002-06-21
  • 打赏
  • 举报
回复
还有没有更好的算法呢??
hammer_shi 2002-06-21
  • 打赏
  • 举报
回复
for (i=0;i<N;i++)
for (j=i+1;j<N;j++)
{
if a[i]>a[j]
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
for (i=N-1;i>0;i++)
{
if (a[i]-a[i-1]<>1) then return (a[i]-1);
}




试试。
hammer_shi 2002-06-21
  • 打赏
  • 举报
回复
挂号!
LeeMaRS 2002-06-21
  • 打赏
  • 举报
回复
建一个标志数组flag[10],清0.
然后循环,从给的数组中读出整数i,将flag[i]置1.
处理完后,再循环一次,检查flag数组,看哪个是0.如果flag[j]是0,那么就缺j.
算法的复杂度,应该是O(n)吧.
TuringQ 2002-06-21
  • 打赏
  • 举报
回复
up

请高手给个代码
hammer_shi 2002-06-21
  • 打赏
  • 举报
回复
排序后再看是否连续,觉得还是么O(n*n)










/*************************************/
/*1、MY TOOL:*************************/
/*2、Delphi,Oracle,Sybase,C++/C*******/
/*3、PROJECT:*************************/
/*3、Boss*****************************/
/*4、为了五星的目标希望你早点结贴*********/
/*5、在线技术讨论(QQ):68123095*********/
/*************************************/

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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