摘要: 1 #include <iostream> 2 3 using namespace std; 4 5 class A 6 { 7 protected: 8 int m_data; 9 10 public:11 A(int data = 0)12 {13 m_data = data;14 }15 int GetData()16 {17 return doGetData();18 }19 20 virtual int doGetData()21 {22 return m_d... 阅读全文
posted @ 2012-08-13 23:01 wolenski 阅读(824) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树: 1 bool IsBalanced(BinaryTreeNode* pRoot) 2 { 3 if(pRoot == NULL) 4 return true; 5 6 int left = TreeDepth(pRoot->m_pLeft); 7 int right = TreeDepth(pRoot->m_pRight); 8 int diff = left - rig... 阅读全文
posted @ 2012-08-12 15:54 wolenski 阅读(287) 评论(0) 推荐(0) 编辑
摘要: 写在前面的话:由于与C++语法相关的面试题,通常用很短的篇幅就能解释清楚,不适合写博客,因此本博客一直没有关注C++的语法题。近期发现篇幅短的C++题目刚好合适微博,于是开始在微博http://weibo.com/zhedahht和http://t.163.com/zhedahht上写C++的系列面试题。感兴趣的读者可以关注我的微博,或者直接围观面试题每日一题系列。同时,我也将不定期整理一些经典的C++面试题,发表到本博客上。题目(一):我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。请问:能 阅读全文
posted @ 2012-08-11 22:56 wolenski 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:12345678910111213141516则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。分析:第一次看到这个题目的时候,觉得这个题目很简单,完全不需要用到数据结构或者算法的知识,因此没有兴趣做这道题。后来听到包括Autodesk、EMC在内的多家公司在面试或者笔试里采用过这道题,于是想这么多家公司用它来检验一个程序员的编程功底总是有原因的,于是决定自己写一遍试一下。真正写一遍才发现,要完整写出这道题的代码,还真不是件容易的 阅读全文
posted @ 2012-08-11 20:51 wolenski 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 题目:设计一个类,我们只能生成该类的一个实例。分析:只能生成一个实例的类是实现了Singleton模式的类型。由于设计模式在面向对象程序设计中起着举足轻重的作用,在面试过程中很多公司都喜欢问一些与设计模式相关的问题。在常用的模式中,Singleton是唯一一个能够用短短几十行代码完整实现的模式。因此,写一个Singleton的类型是一个很常见的面试题。事实上,要让一个类型是能创建一个实例不是一件很难的事情。我们可以把该类型的构造函数设为private,这样该类型的用户就不能创建该类型的实例了。然后我们在给类型中创建一个静态实例。当用户需要该类型的实例时,我们就返回这个实例。基于这个思路,我们可 阅读全文
posted @ 2012-08-11 19:50 wolenski 阅读(297) 评论(2) 推荐(0) 编辑
摘要: 题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:1 double Power(double base, int exponent)2 {3 double result = 1.0;4 for(int i = 1; i <= exponent; ++i)5 result *= base;6 7 return result;8 }上述代码至少有一个问题:由于输入... 阅读全文
posted @ 2012-08-10 22:44 wolenski 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。分析:玩过麻将的都知道,骰子一共6个面,每个面上都有一个点数,对应的数字是1到6之间的一个数字。所以,n个骰子的点数和的最小值为n,最大值为6n。因此,一个直观的思路就是定义一个长度为6n-n的数组,和为S的点数出现的次数保存到数组第S-n个元素里。另外,我们还知道n个骰子的所有点数的排列数6^n。一旦我们统计出每一点数出现的次数之后,因此只要把每一点数出现的次数除以n^6,就得到了对应的概率。该思路的关键就是统计每一点数出现的次数。要求出n个骰子的点数和,我们可以先把n个骰子分为两堆:第一堆只 阅读全文
posted @ 2012-08-10 22:14 wolenski 阅读(2604) 评论(0) 推荐(0) 编辑
摘要: 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。我们试着用二元查找法的思路在寻找这个最小的元 阅读全文
posted @ 2012-08-08 16:20 wolenski 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 大一下学期遇到的问题,现在想起来把他搞明白………………--------------------------------------------------------------------------------------------------------------------------------这个是<stdio.h>中定义的scanf:_CRTIMP int __cdecl __MINGW_NOTHROW scanf (const char*, ...);这是scanf函数的一般形式(百度百科):scanf(格式控制,地址表列)int scanf(char *for 阅读全文
posted @ 2012-08-08 14:24 wolenski 阅读(899) 评论(0) 推荐(0) 编辑
摘要: 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。分析:这题目很有意思,是一个典型的寓教于乐的题目。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我 阅读全文
posted @ 2012-08-07 22:41 wolenski 阅读(416) 评论(0) 推荐(0) 编辑