1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
2007-03-16 20:37
686 查看
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。
int Find(int * a)
{
int i;//变量
for (i = 0 ;i<=1000;i++)
{
a[1000] += a[i];
}
a[1000] -= (i*(i-1))/2 //i的值为1001
return a[1000];
}
利用下标与单元中所存储的内容之间的特殊关系,进行遍历访问单元,一旦访问过的单
元赋予一个标记,利用标记作为发现重复数字的关键。代码如下:
[align=left]void FindRepeat(int array[], int length)[/align]
[align=left]{[/align]
[align=left] int index=array[length-1]-1;[/align]
[align=left] while ( true )[/align]
[align=left] {[/align]
[align=left] if ( array[index]<0 )[/align]
[align=left] break;[/align]
[align=left] array[index]*=-1;[/align]
[align=left] index=array[index]*(-1)-1;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] cout<<"The repeat number is "<<index+1<<endl;[/align]
[align=left]}[/align]
此种方法不非常的不错,而且它具有可扩展性。在坛子上有人提出:
对于一个既定的自然数 N ,有一个 N + M 个元素的数组,其中存放了小于等于 N 的所有
自然数,求重复出现的自然数序列{X} 。
对于这个扩展需要,自己在A_B_C_ABC(黄瓜儿才起蒂蒂)的算法的基础上得到了自己的算法
代码:
按照A_B_C_ABC(黄瓜儿才起蒂蒂)的算法,易经标记过的单元在后面一定不会再访问到,除非它是重复的数字,也就是说只要每次将重复数字中的一个改为靠近N+M的自然数,让遍历能访问到数组后面的单元,就能将整个数组遍历完。
代码:
*/
void FindRepeat(int array[], int length, int num)
{
int index=array[length-1]-1;
cout<<"The repeat number is ";
while ( true )
{
if ( array[index]<0 )
{
num--;
array[index]=length-num;
cout<<index+1<<'t';
}
if ( num==0 )
{
cout<<endl;
return;
}
array[index]*=-1;
index=array[index]*(-1)-1;
}
}
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。
int Find(int * a)
{
int i;//变量
for (i = 0 ;i<=1000;i++)
{
a[1000] += a[i];
}
a[1000] -= (i*(i-1))/2 //i的值为1001
return a[1000];
}
利用下标与单元中所存储的内容之间的特殊关系,进行遍历访问单元,一旦访问过的单
元赋予一个标记,利用标记作为发现重复数字的关键。代码如下:
[align=left]void FindRepeat(int array[], int length)[/align]
[align=left]{[/align]
[align=left] int index=array[length-1]-1;[/align]
[align=left] while ( true )[/align]
[align=left] {[/align]
[align=left] if ( array[index]<0 )[/align]
[align=left] break;[/align]
[align=left] array[index]*=-1;[/align]
[align=left] index=array[index]*(-1)-1;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] cout<<"The repeat number is "<<index+1<<endl;[/align]
[align=left]}[/align]
此种方法不非常的不错,而且它具有可扩展性。在坛子上有人提出:
对于一个既定的自然数 N ,有一个 N + M 个元素的数组,其中存放了小于等于 N 的所有
自然数,求重复出现的自然数序列{X} 。
对于这个扩展需要,自己在A_B_C_ABC(黄瓜儿才起蒂蒂)的算法的基础上得到了自己的算法
代码:
按照A_B_C_ABC(黄瓜儿才起蒂蒂)的算法,易经标记过的单元在后面一定不会再访问到,除非它是重复的数字,也就是说只要每次将重复数字中的一个改为靠近N+M的自然数,让遍历能访问到数组后面的单元,就能将整个数组遍历完。
代码:
*/
void FindRepeat(int array[], int length, int num)
{
int index=array[length-1]-1;
cout<<"The repeat number is ";
while ( true )
{
if ( array[index]<0 )
{
num--;
array[index]=length-num;
cout<<index+1<<'t';
}
if ( num==0 )
{
cout<<endl;
return;
}
array[index]*=-1;
index=array[index]*(-1)-1;
}
}
相关文章推荐
- 题目:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
- 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
- 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次
- 1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次,要求速度尽可能的快
- 数据结构面试题总结5——数组:找出数组中唯一一个出现一次的元素
- Single Number--找出数组中唯一的一个只出现一次的元素
- python字典分别按照key和value升序或者降序排列--以给定一个含有重复元素的数组list,按照其出现次数大小降序输出
- 每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
- 一个整形数组中只有两个数字是出现一次,其它成对出现
- 给定一个排序数组,删除重复的位置,使每个元素只出现一次,并返回新的长度。
- 一个整形数组中只有两个数字是出现一次,其它成对出现
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 数组中每个元素都出现了两次,但是其中一个元素只出现了一次,求出此元素
- 【算法】寻找数组中出现的唯一重复的一个数
- 一个数组有除了两个元素只出现一次,其他元素全部都出现了两次,请找出只出现一次的两个元素,并输出
- C语言- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字,编程实现。
- 一个整型数组里除了两个数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 数组中唯一出现一次的一个,两个,三个数,其余数都是偶数次出现(java版本)
- 一个整型数组中,每个元素两两出现,其中一个元素只出现一次,请找出来
- 一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字(数组指针的方法)