常见智力算法类面试题分析
2015-11-15 22:42
281 查看
1. 二进制中1 的个数
2. 出现次数超过一半的数字
利用标记,相邻相同就是加1,不同减1
一个数字,一个次数
3. 找到最小的K 个数字
维护一个大小为K 的 二叉树容器,最大的值与数组中数字比较,小则放入容器
4. 连续子数组的最大和
动态规划, f(i) = f(i - 1) + pData[i] (i!= 0 || f(i-1)>0) // pData[i] (i==0 || f(i-1) <=0)
5. 求数列中满足条件的数,比如数列1~10,中满足相加和为10 的数列
思路: 利用01背包问题解法,即放入某个数或者不放入某个数
int NumberOf1(int n) { int count = 0; while (n) { ++ count; n = (n-1) & n; } return count; }
2. 出现次数超过一半的数字
利用标记,相邻相同就是加1,不同减1
一个数字,一个次数
3. 找到最小的K 个数字
维护一个大小为K 的 二叉树容器,最大的值与数组中数字比较,小则放入容器
4. 连续子数组的最大和
动态规划, f(i) = f(i - 1) + pData[i] (i!= 0 || f(i-1)>0) // pData[i] (i==0 || f(i-1) <=0)
maxSub(int data[], int n) { if(n <0 ) return if (n ==0) ruturn data[i] if( sum[n-1] <=0) return data[i] if( sum[n-1] > 0 ) return sum[n-1] + data[i] }
5. 求数列中满足条件的数,比如数列1~10,中满足相加和为10 的数列
思路: 利用01背包问题解法,即放入某个数或者不放入某个数
list<int> listUse; void find_factor(int sum, int n) { if(n<=0 || sum<= 0) return; if(sum ==n) { // listUse.reverse(); for(list<int>::iterator iter = listUse.begin(); iter != listUse.end(); iter++) cout<<*iter<<"+"; cout<<n<<endl; // listUse.reverse(); } listUse.push_front(n); find_factor(sum-n,n-1); listUse.pop_front(); find_factor(sum,n-1); } int main() { int sum = 10, n = 10; find_factor(sum,n); return 0 ; }
相关文章推荐
- 测试职业发展如何做-1
- 黑马程序员——OC基础05—Foundation框架
- 【黑马程序员】IO流的几个问题
- Activity的生命周期详解+面试 Activity的启动模式
- 【黑马程序员】-我的OC学习笔记(1)-类
- IOS面试宝典
- 有人说,程序员不配叫工程师!
- Java面试宝典-异常
- 程序员养成之路--New Start
- [转载] 陈皓——程序员技术练级攻略
- IOS面试题<转>
- 几本对于笔试和面试有用的书
- 黑马程序员——java反射
- Top 50 Java 线程并发的面试问题
- Java再学习——随机面试题
- 一道js面试题引发的思考
- 找出一个整数数组中,第二大的数
- 四到五年的程序员怎么突破?
- 看见的一个mysql面试题
- 黑马程序员_NSArray