乐视TV2015校园招聘A第二个大的发行量(of中国Academy科学大学站)
2015-06-18 09:49
387 查看
标题叙述性说明:鉴于阵列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取余。
代码例如以下:
參考: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; } }
相关文章推荐
- 编译:ffmpeg,精简ffmpeg.exe
- 插件二之页面加载进度条pace.js
- 使用FFmpeg将mp4转为ts(代码实现)
- verilog入门经验(二)--分频及counter的巧用
- 让 keil MDK 支持C99
- Crontab定时任务配置
- 移位
- 线宽对应的电流(硬件设计参考)
- iOS开发系列--NextPrevious On-Demand Resource Basics
- Android makefile文件语法规范及使用模板
- 《一个程序员的生命周期》读后感
- HDU3415
- fopen() 返回 NULL, 奇葩原因:当前进程打开多个句柄,忘记关闭。(bug)
- 可变参数和不可变参数的比较
- 1030. Travel Plan (30)
- Changes in Microsoft Dynamics AX 2012 InventTrans data model
- c语言: 修改参数的地址,及注意事项
- 使用 Google Fonts 为网页添加美观字体
- 浅谈Jquery核心函数
- Android开发第二阶段(1)