zoukankan      html  css  js  c++  java
  • 乐视TV2015校园招聘A第二个大的发行量(of中国Academy科学大学站)

    标题叙述性说明:鉴于阵列A,尺寸n,数组元素1至n数字。但是一些数字多次出现。有些数字不出现。请设计算法和程序,统计数据不会出现什么。什么号码多次出现。在O(n)时间复杂度,O(1)在完成它的空间复杂性要求?(思路和代码)


    參考:http://mp.weixin.qq.com/s?

    __biz=MjM5ODIzNDQ3Mw==&mid=200446711&idx=1&sn=09b2db28fcfa289cfb69d60f066d1d91#rd

    主要思路:四次遍历。

    第一遍历:确定是否所有数字都一样,比如出现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;
    	}
    }


  • 相关阅读:
    phpstorm操作集锦
    图片、音频获取二进制流或url的blob值
    sublime text 3 快捷键
    dd与sql 打印工具
    php生成二维码(可带logo)
    jQuery append加入的元素 绑定事件无效
    Linux运维架构师学习之路
    硬盘安装win7
    Composer安装与使用
    Js循环做法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4585039.html
Copyright © 2011-2022 走看看