aurain
技术文摘
posts - 137,  comments - 268,  trackbacks - 0

/*
题目:一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
解题思路:循环遍历数组中的每一个元素i,如果其值为-1,说明该元素已经处理完毕。
否则,首先判断其值是否与下标一样(a[i]==i),
如果不一样,则将其值作为下标(记t=a[a[i]]),判断a[t]==-1,如果成立,则表示有重复的。
否则,令a[i]=a[t],a[t]=-1。表示新下标t的元素已经处理完毕。
再次判断新的a[i]是否与下标一样...
详细看代码...

*/
#include "stdafx.h"
#include <iostream>
using namespace std;

//返回1表示有相同的,0表示没有
int HasSame(int a[], int n)
{
 for (int i=0; i<=n; i++)
 {
  while (a[i] != i && a[i] != -1)
  {
   if (a[a[i]] == -1)
   {
    return 1;
   }
   a[i] = a[a[i]];
   a[a[i]] = -1;
  }
  if (a[i] == i)
  {
   a[i] = -1;
  }
 }
 return 0;
}

#define N 4
int _tmain(int argc, _TCHAR* argv[])
{
 int a[N] = {0,2,3,3};
 int iHasSame = HasSame(a, N);
 cout<<iHasSame<<endl;
 return 0;
}

posted on 2008-06-03 10:51 阅读(3077) 评论(6)  编辑 收藏 引用 所属分类: 算法与数据结构

FeedBack:
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
2008-06-06 17:36 | zambiafrog@gmail.com
我觉得这样太慢了。我的思路是:使用一个额外的等长的数组B ,初始化为0。遍历原始数组A,检查B[A[i]],如果是0,则置位,否则,有重复的元素,返回  回复  更多评论
  
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
2008-06-07 00:33 |
@zambiafrog@gmail.com
这样确实会快些,但需要额外的o(n)空间了  回复  更多评论
  
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
2008-06-18 19:56 | fgcmaster
思想不错。。可程序有问题啊。。。

a[5]={2,1,0,4,3} 测试看看。。。

a[i] = a[a[i]];
a[a[i]] = -1;
??  回复  更多评论
  
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
2008-06-18 22:08 |
@fgcmaster
谢谢你的认真测试,确实有问题,改后如下:
int HasSame(int a[], int n)
{
int tmp = 0;
for (int i=0; i<n; i++)
{
while (a[i] != i && a[i] != -1)
{
if (a[i] > 0 && a[a[i]] == -1)
{
return 1;
}
tmp = a[i];
a[i] = a[a[i]];
a[tmp] = -1;
}
if (a[i] == i)
{
a[i] = -1;
}
}
return 0;
}
  回复  更多评论
  
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素[未登录]
2008-07-08 08:35 | snow
好像还是不对啊, 你试过 int a[] = {0, 2, 4, 0, 3};
  回复  更多评论
  
# re: 一个数组,下标从0到n,元素为从0到n的整数。判断其中是否有重复元素
2008-07-08 13:53 |
@snow
谢谢,我再看看了,考虑问题太不严密了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(17)

随笔分类(138)

随笔档案(137)

网络开发

最新随笔

搜索

  •  

积分与排名

  • 积分 - 493818
  • 排名 - 36

最新随笔

最新评论

阅读排行榜

评论排行榜