摘要: 1. 题目:给定一组硬币排成直线(假设硬币数量为偶数),有两个人开始取硬币。每次只能从队列两端取硬币。有没有这样一种方案使先手取硬币,最后得到的硬币面值最大?给出这样一种方案并给出取法及最终获得的最大面值。2. 文章中给出了详细的解释,这类就不说了。3. 代码: 1 #include <iostream> 2 #include <cassert> 3 4 using namespace std; 5 const int MAX_N = 100; 6 7 void printMoves(int P[][MAX_N], int A[], int N) { 8 int sum 阅读全文
posted @ 2012-08-16 16:49 kasuosuo 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个数组a(a中不存在重复元素)和一个值k,求出a中元素之和为k的所有组合。比如a为{7,3,6,2},k=7,则所有组和有2+2+3和7。2. 解析:回溯+递归。比较难以理解的是index索引的使用,代码如下:void printSum(int candidates[], int index[], int n) { for (int i = 1; i <= n; i++) cout << candidates[index[i]] << ((i == n) ? "" : "+"); cout << 阅读全文
posted @ 2012-08-16 14:55 kasuosuo 阅读(1299) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定两个有序数组(升序)。求两个数组合并之后的第k小值。2. 分析:常规算法将数组合并,之后从前向后遍历一次,找到k位的值,时间复杂度O(m+n)。改进之后的算法:不需要归并两个数组,而是使用两个指针分别从两个有序数组的起始向后走,如果a[i]<=b[j],那么i++,直到a[i]>b[j] ; 如果a[i]>=b[j],那么j++,直到a[i]<b[j],不过i和j要满足条件i+j+1<k。具体算法流程见代码。算法时间复杂度为O(k)。文章中给出了一个很好的算法:二分搜索的变形。具体见代码。3. 代码: 1 #include <iostream 阅读全文
posted @ 2012-08-16 14:08 kasuosuo 阅读(903) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:给定一个数组,和一个值k,数组分成k段。要求这k段子段和最大值最小。求出这个值。2.分析:这道题目很经典,也很难,个人认为很难。文章中给出了三种算法:算法1,暴力搜索。本题暴力搜索算法并不是很明显,可以使用递归实现暴力搜索。递归首先要有递归式: nn-1M[n, k] = min { max { M[j, k-1], ∑ Ai } } j=1 i=jn表示数组长度,k表示数组分成几段。初始化条件:M[1, k] = A0 n-1M[n, 1] = ∑ Ai i=0很容易发现上述的递归算法拥有指数时间的复杂度,并且会重复计算一些M值。这类的算法一般... 阅读全文
posted @ 2012-08-16 13:38 kasuosuo 阅读(2346) 评论(0) 推荐(0) 编辑
摘要: 1. 面试的题目很多是关于位运算的。位运算包括:与,或,异或,取反,左移,右移。2.下面是几道位运算的经典题目。2.1 判断一个数是不是2的密次方?解析:一个数要是2的密次方,必然其二进制表示只有一位为1。所以题目转换为判读这个数是否只有一位为1??代码如下:1 bool IsTwoPower(unsigned int x) 2 { return !(x & (x-1)); } 但是上述代码有一个问题,就是当x=0时,返回值也是true,显然0不是2的密次方。代码修改如下:1 bool IsTwoPower(unsigned int x) 2 { return x && 阅读全文
posted @ 2012-08-16 10:09 kasuosuo 阅读(346) 评论(0) 推荐(0) 编辑