随笔分类 -  经典面试题( 算法为主 )

搜集各大IT企业的面试题
面试题八 二进制中 1 的个数
摘要:题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。分析 首先要明白:一个整数和它减去 1 的结果做与运算,相当于把它最右边的 1 变成 0。 这样可以用一个循环程序解决这个问题,每次循环都让整数和它减去 1 的结果做或运算,循环判定该数是否为 0 ,这样,循环的次数即是该数中有 1 变成 0 的次数,也即该数中 1 的个数。代码实现 1 #include 2 3 using namespace std; 4 5 int numberOf1(int n) { 6 int count = 0; 7 8 while (n) { 9 +... 阅读全文

posted @ 2014-04-10 11:58 空山悟 阅读(245) 评论(0) 推荐(0)

面试题七 斐波那契数列
摘要:题目 写一个函数,输入 n,求斐波那契数列的第 n 项。斐波那契数列的定义如下: 分析 由数列公式可知用递归法是很容易进行求解的,但递归求解的效率会很低,因此需要考虑使用循环求解。 一般来说,能够用递归实现的程序也可以用循环实现,但较之循环法,递归程序虽然设计上更容易,但效率却受到很大影响。代码实现一:递归法 1 #include 2 3 using namespace std; 4 5 int fb(int n) { 6 if (n > n;21 22 int result = fb(n);23 24 cout 2 3 using namespace... 阅读全文

posted @ 2014-04-10 11:27 空山悟 阅读(594) 评论(0) 推荐(0)

面试题六 用两个栈实现队列
摘要:题目 用两个栈实现队列的进队和出队功能分析 1. 栈直接用C++的容器适配器 stack 实现 2. 当进队时,直接往栈 1 存放数据;当出队时,如果栈 2 非空则直接从栈 2 取数,否则将栈 1 的数据全部出栈并转移至栈 2,然后再从栈 2 取数。 3. 考虑到这里采用的两个栈应当要封装起来,因此,采用类来实现这个队列。代码实现 1 #include 2 #include 3 4 using namespace std; 5 6 // 队列定义 7 class SQueue { 8 public: 9 SQueue (void) {10 }11 ~SQ... 阅读全文

posted @ 2014-04-09 17:20 空山悟 阅读(353) 评论(0) 推荐(0)

面试题五 重建二叉树
摘要:题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。分析 1. 取先序遍历的第一个值为树的根结点 2. 在中序遍历中找到1中的那个结点 3. 中序遍历中,处于该结点左侧的所有结点,是该树左子树的中序遍历;处于该结点右侧的所有结点,是该树右子树的中序遍历。 4. 前序遍历中,左右子树的前序遍历也是分开放的。因此根据3中获得的中序遍历的长度,可以将前序遍历分割为左右子树的前序遍历。 根据这个思路,就可以写出递归算法/程序了。代码实现( 含测试 ) 1 #include 2 3 using namespace std; 4 5 // 定义二叉树结点类型 6 ... 阅读全文

posted @ 2014-03-18 16:16 空山悟 阅读(244) 评论(0) 推荐(0)

面试题四 从尾到头打印链表
摘要:题目 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。分析 这个题目有三种解法,可以根据实际情况灵活选用。解法一 堆栈法 设立一个堆栈,然后遍历一次链表,其间将数据依次存入堆栈。遍历完之后将所有元素依次出栈并打印即可。 PS:这里堆栈直接用C++中的stack容器适配器实现代码实现( 含测试 ) 1 #include 2 #include 3 4 using namespace std; 5 6 /* 7 * 定义结点类型 8 */ 9 struct ListNode {10 int value;11 ListNode *next;12 };13 14... 阅读全文

posted @ 2014-03-17 22:55 空山悟 阅读(202) 评论(0) 推荐(0)

面试题三 替换空格
摘要:题目 请实现一个函数,把字符串中的每个空格替换成" %20 "。( 假定字符串未使用空间足够且只允许在原字符串上做替换 ) PS:括号内的说明未必会给出,这时候需要和考官进行沟通,了解他具体的需求。差劲的思想 1. 编写一个移位函数,每次调用可将字符串的未处理部分往后移两个位置。 2. 遍历目标字符串,每当遇到空格则先调用1中函数一次,再将空格替换成%20,然后继续遍历。分析 O(n²)的复杂度,显然不会让自己以及面试官满意。 如果能够在遍历的过程中,每次都将处理的字符移动到它最终的位置,那么复杂度就可降低到O(n)。对此,可以采用从后往前遍历的方法,设定两个指针 阅读全文

posted @ 2014-03-10 20:32 空山悟 阅读(264) 评论(0) 推荐(0)

面试题二 二维数组中的查找
摘要:题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。误区 对于这道题,很多人从一般的角度思考解决方法:比如想到若数组检索对象大于该整数,则可以剔除该元素右下方的所有元素;若数组检索对象小于该整数,则可以剔除该元素左上方的所有元素。 可是然后呢?很多人就在这里卡住了。因为剔除后的区域遍历起来太过复杂,一时半刻谁也想不出来。正解 应当从具体问题入手,通过分析简单具体的例子,发现普遍的规律。 现在假定,我们要从二维数组 1 2 8 9 2 4 9 12 4 7 10... 阅读全文

posted @ 2014-02-27 23:42 空山悟 阅读(413) 评论(0) 推荐(0)

面试题一 赋值运算符函数
摘要:题目 如下为类CMyString的声明,请为该类型添加赋值运算符函数。1 class CMyString {2 public:3 CMyString (char * pData = NULL);4 CMyString (const CMyString & str);5 ~CMyString (void);6 7 private:8 char * m_pData;9 };错解 1 class CMyString { 2 public: 3 CMyString (char * pData = NULL); 4 CMyString (const CM... 阅读全文

posted @ 2014-02-26 22:24 空山悟 阅读(368) 评论(0) 推荐(0)

导航