程序员笔试面试算法题系列--数组
2015-07-27 20:19
330 查看
题目来源于《程序员面试笔试宝典》、各大博客以及历年真题,供大家查漏补缺。(持续更新中)
1 递归实现数组求和
2 利用一个for循环打印二维与三维数组
3 递归判断数组是否递增
4 分别使用递归与非递归实现二分查找
二分查找,必须熟练掌握的基础算法,有很多相关变形,常被用于提升算法效率。
5 在排序数组中确定给定数字出现的次数
利用二分查找确定给定数字的左右边界即可。
6 计算两个有序数组交集
比较大小,选取较小者,合并
7 找出数组中重复次数最多的数
有两种常用解法:1) 用一变量存储当前数的重复次数,当与数组下一个数相同时,重复次数加1,否则减1,当重复次数为0时,替换当前数。
9 判断数组中数值是否连续(0可替代任意数)
数组排序,计算最大值与最小值差是否在一定范围内。
10 N个元素,2个数出现奇数次,其余数均出现偶数次,求这两个数。
奇偶数问题一般可通过位运算解决。本体可通过两次总体的异或操作得到最终结果。
1 递归实现数组求和
void Sum(int a[],int n,double& sum)每次递归,在sum上累加,同时n自减,当n<0,退出递归。
2 利用一个for循环打印二维与三维数组
double total=row*col; for(int k=0;k<total;k++) { printf("%d ",a[k/col][k%col]); }三维类似,a[k/yz][k/z%y][k%z]
3 递归判断数组是否递增
return a[i]<a[i+1]&&isIncrease(a,i+1);
4 分别使用递归与非递归实现二分查找
二分查找,必须熟练掌握的基础算法,有很多相关变形,常被用于提升算法效率。
5 在排序数组中确定给定数字出现的次数
利用二分查找确定给定数字的左右边界即可。
6 计算两个有序数组交集
比较大小,选取较小者,合并
7 找出数组中重复次数最多的数
map<int,int> m_count; int val=0; for(int i=0;i<n;i++) { if(++m_count[a[i]]>m_count[val]) val=a[i]; }8 找出数组中出现次数超过一半的数
有两种常用解法:1) 用一变量存储当前数的重复次数,当与数组下一个数相同时,重复次数加1,否则减1,当重复次数为0时,替换当前数。
double sum=0; for(int i=0;i<n;i++) { if(i==0||a[i]==currentNum) {currentNum=a[i];sum++;} else if(sum>0) sum--; else {currentNum=a[i];sum=1;} }2) 另一种解法威力更大,即利用快速排序中的分区算法partition,这一算法能够在nlogn时间复杂度内寻找前k个数,在本题中,k=n/2。
9 判断数组中数值是否连续(0可替代任意数)
数组排序,计算最大值与最小值差是否在一定范围内。
10 N个元素,2个数出现奇数次,其余数均出现偶数次,求这两个数。
奇偶数问题一般可通过位运算解决。本体可通过两次总体的异或操作得到最终结果。
相关文章推荐
- 数据科学家可能成为2015年最热门职业
- 面试题 ——— 二维数组的查找
- 面试题22_栈的压入和弹出序列
- 记阿里电话面试-研发工程师(JAVA)
- 剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
- 黑马程序员--iOS--C基础(二)
- 【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字
- 推荐!国外程序员整理的Java资源大全
- 黑马程序员——10,线程
- 剑指Offer面试题6(Java版):重建二叉树
- 心中的激动与兴奋交加,阿里内推面试
- catalan数及笔试面试里那些相关的问题(转)
- 一个优秀的程序员
- 为什么程序员在办公室工作会趋向死亡?
- 程序员眼中的CPU
- 小白鼠喝毒水的问题
- 美团网Java工程师面试题
- 浅谈程序员接私单那点事及接私单需要注意的问题
- 面试经典(1)---翻转字的顺序在一个句子
- 程序员都应学习代码编译器知识