博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
音乐TV2015校园招聘A第二大发行量(对中国科学院大学站)
阅读量:5240 次
发布时间:2019-06-14

本文共 943 字,大约阅读时间需要 3 分钟。

标题叙述性说明:鉴于阵列A,尺寸n,数组元素1至n数位,但是,一些数字多次出现,有些数字不出现。请设计算法和程序。统计数据不会出现什么。什么号码多次出现。

您可以O(n)时间复杂度,O(1)求下完毕么?(思路和代码)

參考:

主要思路:四次遍历。

第一遍历:确定是否所有数字都一样,比如出现n个1或者n个2的情况。若一样。直接输出结果。否则进入第二次遍历。

(这是我看了參考后加入的)

第二次遍历:对全部]i运行A[i] = A[i] *n

第三次遍历:对全部i运行++A[A[i]/n]

第四次遍历:对全部i运行A[i] = A[i] % n

这样,A[i]的值为i在数组中出现的次数。

解释:

1、因为第一次遍历。保证了后序步骤中随意元素出现的次数不可能超过n。

2、先运行A[i]=A[i]*n,让取余的时候A[i]本身的值不会对i出现的次数产生影响。

3、然后运行++A[A[i]/n]。对A[i]本来的位置不断添加1,但绝不会超过n。所以每一个i出现的次数,就是A[i]对n取余。

代码例如以下:

void repetitions(int a[], int n){	int i = 1;	int frequencey = 0;	int element;	int temp;		temp = a[1];	for(i = 2; i <= n; ++i){		if(a[i] != temp)			break;	}	if(i == n + 1 && a[i-1] == temp)	{		cout << temp << "出现了" << n << "次,其余数字没有出现" << endl;		return;	}	for(i = 1; i <= n; ++i)		a[i] *= n;	for(i = 1; i <= n; ++i){		++a[a[i]/n];	}	for(i = 1; i <= n; ++i){		cout << i << "出现了" << a[i] % n << "次" << endl;	}}

版权声明:本文博主原创文章,博客,未经同意不得转载。

转载于:https://www.cnblogs.com/mengfanrong/p/4810649.html

你可能感兴趣的文章
python pdf转word
查看>>
poj 2182 Lost Cows
查看>>
OpenFlow 交换机与控制器交互步骤
查看>>
java-内存模型
查看>>
文本相似度比较(网页版)
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)
查看>>
codeforces 315 308
查看>>
BZOJ3998 [TJOI2015]弦论 【后缀自动机】
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
svn 架设
查看>>
k8s部署rocketmq 双主
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Explicit keyword
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
Erdaicms旅游网站程序,微信扫码登录演示和示例程序
查看>>
15第十五章UDF用户自定义函数(转载)
查看>>