摘要: 1. 逗号表达式 c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60 逗号表达式的形式如下: 表达式1,表达式2,表达式3,...... ,表达式n 逗号表达式的要领: (1) 逗号表达式的运算过程为:从左往右逐个计算表达式。 (2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。 (3) 逗号运算符的优先级别在所有运算符中最低。2. volatile关键字 volati... 阅读全文
posted @ 2012-08-26 20:42 kasuosuo 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 以下介绍转载自:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,false po 阅读全文
posted @ 2012-08-26 16:41 kasuosuo 阅读(1363) 评论(0) 推荐(0) 编辑
摘要: 转自博客:http://blog.csdn.net/star143133/article/details/6854745 代码见Problem28问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;(3)子问题可通过再次递归调用求解;(4)子问题的解应能组合成整个问题的解。 对于字符串的排列问题。如果能生成n - 1个元素的全排列,就能生成n 阅读全文
posted @ 2012-08-25 15:42 kasuosuo 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 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) 编辑
摘要: 1. 题目:给定一个整数数组,要求输出一个数组,使新数组的第i位是原数组中除去第i位剩余数字的乘积。如输入{4,3,2,1,2},输出{12,16,24,48,24}。要求时间复杂度为:O(n),且不能使用除法运算。2. 分析:如果可以使用除法运算很容易想到的算法是将原数组中所有数字相乘,然后遍历,每次除以原数组中的第i位,即得到新数组中的第i位。但是这个算法有一个问题,要是原数组中存在一个数字为0,那么乘积自然也为0,那么新数组中的所有数字都是0,结果不对,而且除以0会导致异常。文章中给出了一个采用O(n)空间的算法,即定义数组B为原数组从左向右相乘的结果{1,4,12,24,24}(第一个 阅读全文
posted @ 2012-08-12 21:29 kasuosuo 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 1. 题目:顺时针螺旋输出二维矩阵。2. 分析:螺旋输出二维矩阵,每次剥除最外层的数据,下次再输出里面的数据。很容易想到,这个可以用递归实现,在输出一圈时,输出顺序为:topLeft-->topRight-->bottomRight-->bottomLeft-->topLeft。在递归程序中怎样计算每一个元素的下标这个是关键。3. 代码: 1 #include<iostream> 2 #include<cassert> 3 4 using namespace std; 5 6 #define ROW 5 7 #define COL 4 8 9 / 阅读全文
posted @ 2012-08-12 17:24 kasuosuo 阅读(431) 评论(0) 推荐(0) 编辑