找出1001个数(区间1~1000)中重复出现的数(有两个相同)
来源:互联网 发布:淘宝发布宝贝没有反应 编辑:程序博客网 时间:2024/06/07 19:51
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
/*
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,
但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现 两次外,
其他所有数字只出现一次。假设你只能对这个数组做一次处理,
用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,
那么你能找到不 用这种方式的算法吗?
我用的是交换查找,说不清楚,举个例子 数组a从1开始,浪费a[0]空间
10 8 5 9 1 7 2 3 6 4 1
第一次 a[1]=10 所以找到a[1]的元素所对应的位置并该位置的数和a[1]交换,并将a[1]置0
变为4 8 5 9 1 7 2 3 6 0 1
第二次 a[1]=4 相同的处理方法
变为9 8 5 0 1 7 2 3 6 0 1
第二次 a[1]=9 相同的处理方法
变为6 8 5 0 1 7 2 3 0 0 1
第四次 a[1]=6 .......
变为 7 8 5 0 1 0 2 3 0 0 1
第五次 a[1]=7 .......
变为 2 8 5 0 1 0 0 3 0 0 1
第六次 a[1]=2
变为8 0 5 0 1 0 0 3 0 0 1
第七次 a[1]=8
变为3 0 5 0 1 0 0 0 0 0 1
第八次 a[1]=8
变为5 0 0 0 1 0 0 0 0 0 1
第九次 a[1]=5
变为0 0 0 0 0 0 0 0 0 0 1
第十次 因为a[1]=0;
所以一直往后直到找到不为0的
a[11]=1和a[1]交换,a[1]位置为0,故已经出现过一次1,所以这是第2个1
故1出现了两次
O(n)情况
*/
int main(void)
{
int array[1002];
int x,flag=0,j;
srand(unsigned(time(NULL)));
array[1] = rand() % 1000+1;
for (int i = 2; i <= 1000; i++)
{
x = rand() % 1000+1;
for ( j = 1; j < i; j++)
{
if (x == array[j]) break;
}
if (j==i){
array[i] = x;
}
else {
i--;
}
}
array[1001] = rand() % 1000+1;
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
int temp1;
for (int i = 1; i <= 11; )
{
if (array[i] == 0) i++;
else
{
temp1 = array[i];
array[i] = array[temp1];
if (array[temp1]) {
array[temp1] = 0;
}
else {
cout << "\n" <<temp1<< endl;
break;
}
if (array[i] == 0) i++;
}
}
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
return 0;
}
#include<cstdlib>
#include<ctime>
using namespace std;
/*
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,
但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现 两次外,
其他所有数字只出现一次。假设你只能对这个数组做一次处理,
用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,
那么你能找到不 用这种方式的算法吗?
我用的是交换查找,说不清楚,举个例子 数组a从1开始,浪费a[0]空间
10 8 5 9 1 7 2 3 6 4 1
第一次 a[1]=10 所以找到a[1]的元素所对应的位置并该位置的数和a[1]交换,并将a[1]置0
变为4 8 5 9 1 7 2 3 6 0 1
第二次 a[1]=4 相同的处理方法
变为9 8 5 0 1 7 2 3 6 0 1
第二次 a[1]=9 相同的处理方法
变为6 8 5 0 1 7 2 3 0 0 1
第四次 a[1]=6 .......
变为 7 8 5 0 1 0 2 3 0 0 1
第五次 a[1]=7 .......
变为 2 8 5 0 1 0 0 3 0 0 1
第六次 a[1]=2
变为8 0 5 0 1 0 0 3 0 0 1
第七次 a[1]=8
变为3 0 5 0 1 0 0 0 0 0 1
第八次 a[1]=8
变为5 0 0 0 1 0 0 0 0 0 1
第九次 a[1]=5
变为0 0 0 0 0 0 0 0 0 0 1
第十次 因为a[1]=0;
所以一直往后直到找到不为0的
a[11]=1和a[1]交换,a[1]位置为0,故已经出现过一次1,所以这是第2个1
故1出现了两次
O(n)情况
*/
int main(void)
{
int array[1002];
int x,flag=0,j;
srand(unsigned(time(NULL)));
array[1] = rand() % 1000+1;
for (int i = 2; i <= 1000; i++)
{
x = rand() % 1000+1;
for ( j = 1; j < i; j++)
{
if (x == array[j]) break;
}
if (j==i){
array[i] = x;
}
else {
i--;
}
}
array[1001] = rand() % 1000+1;
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
int temp1;
for (int i = 1; i <= 11; )
{
if (array[i] == 0) i++;
else
{
temp1 = array[i];
array[i] = array[temp1];
if (array[temp1]) {
array[temp1] = 0;
}
else {
cout << "\n" <<temp1<< endl;
break;
}
if (array[i] == 0) i++;
}
}
for (int i = 1; i <= 11; i++)
{
cout << array[i] << " ";
}
return 0;
}
0 0
- 找出1001个数(区间1~1000)中重复出现的数(有两个相同)
- 删除数组中相同的数,统计两个数组中重复数个数并把不同数找出来
- 找出二进制表示中1的个数相同,且大小最接近的那两个数
- 程序员面试金典--面试27之有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数
- 9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
- 在一个大数组中有且仅有两个数相同,怎样尽快找出这两个数(未完成)
- 找出两个含有相同元素个数的递增数列中第n小的数
- 从100W个数中最快找出两个相同的数
- 一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1
- 1001个数分别在区间[1,1000]中,也就是说包含1-1000所有数,所以有1个数重复,问怎么找这个数最快?
- 在1000个数中找出出现次数最多的数
- 有N个数,其中2个数出现了奇数次(这两个数不相等),其他数都出现偶数次,问用O(1)的空间复杂度,找出这两个数,不需要知道具体位置,只需要知道这两个值。
- 如果1000001个数中,有一个是重复的,如何找出这个数。
- 从n个数中找出每个数的重复数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- RHEL7: Create a local repositor
- 中科院开源协会镜像站 Android SDK镜像测试发布
- 关于删记录释放表空间的测试
- word宏批量处理图片大小
- linux程序设计——入门(第一章)
- 找出1001个数(区间1~1000)中重复出现的数(有两个相同)
- Setup Local Yum Repository On CentOS 7
- KMP算法
- freemarker list (长度,遍历,下标,嵌套,排序)
- CSS定位
- How to Install GUI (Gnome 3) Using CD/DVD on RHEL/CentOS 7
- IE 6 7 8获取文本框中光标的位置
- java内存划分
- QT5.3 杂记 Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块。随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系。