07 2012 档案

摘要:题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,因此一些重视算法的公司像MicroStrategy都把它当作面试题。这个问题的详细分析见《算法导论》1 阅读全文
posted @ 2012-07-11 22:20 wolenski 阅读(293) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:1 struct ListNode2 {3 int m_nKey;4 ListNode* m_pNext;5 };分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。为了正确地反转一个链表,需要调整指针的指向。与指针操作相关代码总是容易出错的,因此最好在动手写程序之前作全面的分析。在面试的时候不急于动手而是一开始做仔细的分析和设计,将会给面试官留下很好的印象,因为在实际的软件开发中,设计的时间总是比写... 阅读全文
posted @ 2012-07-11 10:20 wolenski 阅读(157) 评论(0) 推荐(0) 编辑
摘要:题目:某队列的声明如下: 1 template<typename T> class CQueue 2 { 3 public: 4 CQueue() {} 5 ~CQueue() {} 6 7 void appendTail(const T& node); // append a element to tail 8 void deleteHead(); // remove a element from head 9 10 private:11 T> m_stack1;12 T> m_stack2... 阅读全文
posted @ 2012-07-11 10:11 wolenski 阅读(207) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数。还是以"345"作为例子。当我们扫描到字符串的第一个字符'3'时,我们不知道后面还 阅读全文
posted @ 2012-07-10 21:28 wolenski 阅读(356) 评论(0) 推荐(0) 编辑
摘要:题目:定义Fibonacci数列如下:/0n=0f(n)=1n=1\f(n-1)+f(n-2)n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,看到题目就能写出如下的递归求解的代码。 1 /////////////////////////////////////////////////////////////////////// 2 // Calculate the nth item of Fibonacci Series recursively 3 ////////////// 阅读全文
posted @ 2012-07-10 21:06 wolenski 阅读(245) 评论(0) 推荐(0) 编辑
摘要:题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。 1 template<typename T> class Array 2 { 3 public: 4 Array(unsigned arraySize):data(0), size(arraySize) 5 { 6 if(size > 0) 7 data = new T[size]; 8 } 9 10 ~Array()11 {12 if(data) dele... 阅读全文
posted @ 2012-07-10 10:16 wolenski 阅读(677) 评论(0) 推荐(0) 编辑
摘要:题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中删除第m个元素。在参考代码中,我们用STL中std::list来模拟这个环形列表。由于list并不是一个环形的结构,因此每次跌代器扫描到列表末 阅读全文
posted @ 2012-07-10 10:03 wolenski 阅读(207) 评论(0) 推荐(0) 编辑
摘要:题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:这道题是2006年google的一道笔试题。看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂度是O(n2)。我们试着去找一个更快的方法。由于题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根 阅读全文
posted @ 2012-07-10 09:49 wolenski 阅读(259) 评论(0) 推荐(0) 编辑
摘要:题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入8/\610 /\/\57911输出861057911。分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点6和10保存到一个数据容器中。现在数据容器中就有两个元素6和10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点5和7放入数据容器中,此时数据容器中有三个元素10、5和7。接下来我们应该从数据容器中取出结点 阅读全文
posted @ 2012-07-10 09:33 wolenski 阅读(198) 评论(0) 推荐(0) 编辑
摘要:题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:8/\610/\/\57911输出:8/\106/\/\119 75定义二元查找树的结点为:1 struct BSTreeNode // a node in the binary search tree (BST)2 {3 int m_nValue; // value of node4 BSTreeNode *m_pLeft; // left child of node5 BSTree... 阅读全文
posted @ 2012-07-10 09:25 wolenski 阅读(236) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的数字。可惜这种思路需要的时间复杂度是O(n2)。我们假设现在随便在数组中找到两个数。如果它们的和等于输入的数字,那太好了,我们找到了要找的两个数字;如果小于输入的数字呢?我们希望两个数字的和再大一点。 阅读全文
posted @ 2012-07-09 22:39 wolenski 阅读(332) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:1 struct ListNode2 {3 int m_nKey;4 ListNode* m_pNext;5 };分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历这个链表,我们还是把思路回到头结点上来。假设整个链表有n个结点,那么倒数第k个结点是从头结点开始的第n-k-1个结点(从0开始计数)。如果我们能够得到... 阅读全文
posted @ 2012-07-09 16:37 wolenski 阅读(233) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。还是以上面的输 阅读全文
posted @ 2012-07-08 22:57 wolenski 阅读(240) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8/\610 / \/ \57911因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应 阅读全文
posted @ 2012-07-08 22:42 wolenski 阅读(255) 评论(0) 推荐(0) 编辑
摘要:题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以先创建一个大小为k的数据容器来存储最小的k个数字。接下来我们每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中;如果容器中已有k个数字了,也就是容器已满,此时我们不能再插入新的数字而只能替换已有的数字。我们找出这已有的k个数中最大值,然和拿这次待插入的整数 阅读全文
posted @ 2012-07-08 22:07 wolenski 阅读(220) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。二元树结点的数据结构定义为:1 struct BinaryTreeNode // a node in the binary tree2 {3 int m_nValue; // value of node4 BinaryTreeNode *m_pLeft; // left child of ... 阅读全文
posted @ 2012-07-08 21:30 wolenski 阅读(163) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题。由于本题在网络中广为流传,本题也顺利成为2006年程序员面试题中经典中的经典。如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾 阅读全文
posted @ 2012-07-08 21:24 wolenski 阅读(189) 评论(0) 推荐(0) 编辑
摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能 阅读全文
posted @ 2012-07-08 21:19 wolenski 阅读(293) 评论(0) 推荐(0) 编辑
摘要:题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树 10 / \ 6 14 / \ / \ 4 8 12 16转换成双向链表4=6=8=10=12=14=16。分析:本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。下面我们用两种不同的递归思路来分析。 思路一:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最近链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)... 阅读全文
posted @ 2012-07-08 21:07 wolenski 阅读(2039) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。引子:判断字符串是否对称要判断一个字符串是不是对称的,不是一件很难的事情。我们可以先得到字符串首尾两个字符,判断是不是相等。如果不相等,那该字符串肯定不是对称的。否则我们接着判断里面的两个字符是不是相等,以此类推。基于这个思路,我们不难写出如下代码: 1 /////////////////////////////////////////////////// 阅读全文
posted @ 2012-07-08 20:46 wolenski 阅读(1225) 评论(0) 推荐(0) 编辑
摘要:题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。分析:这是一道广为流传的面试题,包括百度、微软和Google在内的多家公司都曾经采用过这个题目。要几十分钟的时间里很好地解答这道题,除了较好的编程能力之外,还需要较快的反应和较强的逻辑思维能力。看到这道题,我们马上就会想到,要是这个数组是排序的数组就好了。如果是排序的数组,那么我们只要遍历一次就可以统计出每个数字出现的次数,这样也就能找出符合要求的数字了。题目给出的数组没有说是排好序的,因此我们需要给它排序。排序的时间复杂度是O(nlogn),再加上遍历的时间复杂度O(n),因此总的复杂度是O(nlogn)。接下来我们试着看看 阅读全文
posted @ 2012-07-07 17:02 wolenski 阅读(548) 评论(0) 推荐(0) 编辑
摘要:题目:二叉树的结点定义如下:1 struct TreeNode2 {3 int m_nvalue;4 TreeNode* m_pLeft;5 TreeNode* m_pRight;6 };输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结点的值比两个结点都大,则最低的共同父结点一定在当前结点的... 阅读全文
posted @ 2012-07-07 16:27 wolenski 阅读(431) 评论(0) 推荐(0) 编辑
摘要:题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:1 struct ComplexNode2 {3 int m_nValue;4 ComplexNode* m_pNext;5 ComplexNode* m_pSibling;6 };下图是一个含有5个结点的该类型复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。请完成函数ComplexNode* Clone(ComplexNode* pHe... 阅读全文
posted @ 2012-07-06 22:32 wolenski 阅读(148) 评论(0) 推荐(0) 编辑
摘要:题目:二叉树的结点定义如下:1 struct TreeNode2 {3 int m_nValue;4 TreeNode* m_pLeft;5 TreeNode* m_pRight;6 };输入两棵二叉树A和B,判断树B是不是A的子结构。例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的子结构。 1 8 / \/ \ 87 9 2/ \ 9 2 / \ 47分析:这是2010年微软校园招聘时的一道题目。二叉树一直是微软面试题中经常出现的数据结构。对微软有兴趣的读者一定要重点关注二叉树。回到这个题目的本身。要查找树A中是否存在和树B结构一样的... 阅读全文
posted @ 2012-07-06 21:53 wolenski 阅读(213) 评论(0) 推荐(0) 编辑
摘要:题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性。首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);第二步做进位,5+7中有进位,进 阅读全文
posted @ 2012-07-04 19:36 wolenski 阅读(183) 评论(0) 推荐(0) 编辑
摘要:问题(1):运行如下的C++代码,输出是什么? 1 class A 2 { 3 public: 4 virtual void Fun(int number = 10) 5 { 6 std::cout << "A::Fun with number " << number; 7 } 8 }; 9 10 class B: public A11 {12 public:13 virtual void Fun(int number = 20)14 {15 std::cout << "B::Fun with number " < 阅读全文
posted @ 2012-07-04 15:48 wolenski 阅读(190) 评论(0) 推荐(0) 编辑
摘要:题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序的算法,要么是O(n2)的,要么是O(nlogn)的。可是这道题竟然要求是O(n)的,这里面到底有什么玄机呢?题目特别强调是对一个公司的员工的年龄作排序。员工的数目虽然有几万人,但这几万员工的年龄却只有几十种可能。上班早的人一般也要等到将近二十岁才上班,一般人再晚到了六七十岁也不得不退休。由于年龄总共只有几十种可能,我们可以很方便地统计出每一个年龄里有多少名员工 阅读全文
posted @ 2012-07-04 15:05 wolenski 阅读(266) 评论(0) 推荐(0) 编辑
摘要:题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。这就是有名的八皇后问题。解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。由于八个皇后的任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。先把ColumnIndex的八个数字分别用0-7初始化,接 阅读全文
posted @ 2012-07-03 23:20 wolenski 阅读(2307) 评论(0) 推荐(1) 编辑
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次 阅读全文
posted @ 2012-07-03 20:47 wolenski 阅读(173) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。分析:在本系列博客的第28题《字符串的排列》中,我们详细讨论了如何用递归的思路求字符串的排列。同样,本题也可以用递归的思路来求字符串的组合。假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;而是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种选择都很容易用递归实现。下面是这种思路的参考代码: 阅读全文
posted @ 2012-07-03 16:29 wolenski 阅读(315) 评论(0) 推荐(0) 编辑
摘要:题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。分析:看到这个题目,很多人的第一反应是找到这个数组的最大值和最小值,然后觉得最大值减去最小值就是最终的结果。这种思路忽略了题目中很重要的一点:数对之差是一个数字减去它右边的数字。由于我们无法保证最大值一定位于数组的左边,因此这个思路不管用。于是我们接下来可以想到让每一个数字逐个减去它右边的所有数字,并通过比较得到数对之差的最大值。由于每个数字需要和它后面的O(n)个数字作减法,因此总的时间复杂度是O(n2)。 阅读全文
posted @ 2012-07-01 22:36 wolenski 阅读(220) 评论(0) 推荐(0) 编辑
摘要:运行下图中的C++代码,打印出的结果是什么? 1 bool Fun1(char* str) 2 { 3 printf("%s\n", str); 4 return false; 5 } 6 7 bool Fun2(char* str) 8 { 9 10 printf("%s\n", str);11 return true;12 }13 14 int _tmain(int argc, _TCHAR* argv[])15 {16 17 bool res1, res2;18 19 res1 = (Fun1("a") && F 阅读全文
posted @ 2012-07-01 16:56 wolenski 阅读(480) 评论(0) 推荐(0) 编辑
摘要:一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中申请512M的内存(40亿 < 2^32 = 8*2^29 bit = 2^9M bytes = 512M)一个bit位代表一个unsigned int值读入40亿个数,设置相应的bit位读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在二、使用位图法判断整形数组是否存在重复判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了。位图法比 较适合于这种情况,它的做法是按照集合中最大元素max 阅读全文
posted @ 2012-07-01 15:18 wolenski 阅读(822) 评论(0) 推荐(1) 编辑