自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 程序员面试题精选(33):两单向链表相交问题

题目:给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针;时间复杂度控制在O(n)的前提下。 这道题首先要弄明白的是,两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是:(1)先找到h1,h2的最后一个节点p1和p2,同时记录节点数量a,b;(2)判断最后一个节点是否相同;

2007-10-28 15:18:00 4468 1

原创 程序员面试题精选(32):金币概率问题(威盛笔试题)

题目: 10个房间里放着随机数量的金币。每个房间只能进入一次,并只能在一个房间中拿金币。一个人采取如下策略:前四个房间只看不拿。随后的房间只要看到比前四个房间都多的金币数,就拿。否则就拿最后一个房间的金币。 编程计算这种策略拿到最多金币的概率。  int genrand(int a, int b){ return rand()%(b-a+1)+a;}void gennum(int *a,

2007-10-27 21:16:00 6058 1

转载 面试题之IQ与逻辑推理题

1、据说此题曾被用来应聘微软公司的高级人才。嘿嘿!各位可有兴趣试试身手,若有志者,看招了!  有两间房,一间房里有三盏灯,另一间房有控制这三盏灯的开关(这两间房是分割开的,毫无联系)。现在要你分别进这两间房一次,然后判断出这三盏分别是由哪个开关控制,你能想出办法吗?(注意:每间房只能进一次)注:这题如果加上是白炽灯会更好点。先开开关A,过段时间,关A,开B,去另一房间,亮着的灯是B控制,不亮的灯中

2007-10-27 16:21:00 8479 3

转载 程序员面试题精选(31):从尾到头遍历链表

题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的

2007-10-24 21:33:00 2811

转载 程序员面试题精选(30):异常安全的赋值运算符重载函数

题目:类CMyString的声明如下:class CMyString{public:      CMyString(char* pData = NULL);      CMyString(const CMyString& str);      ~CMyString(void);      CMyString& operator = (const CMyString& str);private:

2007-10-24 17:14:00 2173

转载 程序员面试题精选(29):调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(

2007-10-24 17:13:00 2085

转载 程序员面试题精选(28):字符串的排列

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列

2007-10-24 17:10:00 2186 1

转载 程序员面试题精选(27):二元树的深度

题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树:                                            10                                          /     /                         

2007-10-24 16:57:00 2346

转载 程序员面试题精选(26):和为n连续正数序列

题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:这是网易的一道面试题。这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移

2007-10-24 16:52:00 1880

转载 程序员面试题精选(25):在从1到n的正数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。用最直观的方法求解并不是很难,但遗憾的是效率不是很高;而要得出一个效率较高的算法,需要比较强的分析能力,并不是件很容易的事情。当然,google的面试题中简单的也没有几道。首先我们来看

2007-10-24 16:47:00 1999 1

转载 程序员面试题精选(24):栈的push、pop序列

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,

2007-10-24 16:45:00 2109 3

转载 程序员面试题精选(23):跳台阶问题

题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再

2007-10-24 16:36:00 1974

原创 程序员面试题精选(22):整数的二进制表示中1的个数

题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成

2007-10-24 16:23:00 3762

转载 程序员面试题精选(21):左旋转字符串

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的辅助

2007-10-24 16:17:00 1953 2

转载 程序员面试题精选(20):最长公共子串

题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。分析:求

2007-10-24 16:08:00 2486

转载 程序员面试题精选(19):反转链表

题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。为了正确地反转一个链表,需要调整指针的指向。与

2007-10-24 16:07:00 1937 1

转载 程序员面试题精选(18):用两个栈实现队列

题目:某队列的声明如下:templatetypename T> class CQueue{public:      CQueue() {}      ~CQueue() {}      void appendTail(const T& node); // append a element to tail      void deleteHead();               // remo

2007-10-24 16:06:00 2063

转载 程序员面试题精选(17):把字符串转换成整数

开发经常遇到的。如果你有兴趣,可以帮忙微软扩展一下ListView在用ListView时,想删除选择项,单选的删除很简单这里讲一下多选的首先我们响应的事件为ListView.KeyDown因为我们要检查的是否按下delete键代码如下: ///         /// key “Delete” is pressed,and then Delete All of ListVi

2007-10-24 15:47:00 1675

转载 程序员面试题精选(16):O(logn)求Fibonacci数列

题目:定义Fibonacci数列如下:        /  0                      n=0f(n)=      1                      n=1        /  f(n-1)+f(n-2)          n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程

2007-10-24 15:15:00 3442 5

转载 程序员面试题精选(15):含有指针成员的类的拷贝

题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。templatetypename T> class Array{public:      Array(unsigned arraySize):data(0), size(arraySize)      {            if(size > 0)                  data =

2007-10-24 15:09:00 1689

转载 程序员面试题精选(14):圆圈中最后剩下的数字

题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数

2007-10-24 14:59:00 2124 1

转载 程序员面试题精选(13):第一个只出现一次的字符

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:这道题是2006年google的一道笔试题。看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间复杂

2007-10-24 14:42:00 3937 8

转载 程序员面试题精选(12):从上往下遍历二元树

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入      8    /  /   6    10  //     // 5  7   9  11输出8   6   10   5   7   9   11。分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。我们从树的根结点开始分

2007-10-24 14:41:00 1762

转载 程序员面试题精选(11):求二元查找树的镜像

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入:     8    /  /  6      10 //       //5  7    9   11输出:      8    /  /  10    6 //      //11  9  7  5定义二元查找树的结点为:

2007-10-24 14:37:00 1664

转载 程序员面试题精选(10):在排序数组中查找和为给定值的两个数字

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等

2007-10-24 14:33:00 2086 3

转载 程序员面试题精选(9):查找链表中倒数第k个结点

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:struct ListNode{      int       m_nKey;      ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打

2007-10-24 14:29:00 2407 2

转载 程序员面试题精选(8):求1+2+...+n

题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。由于已经明确限制

2007-10-24 14:23:00 2419 5

转载 程序员面试题精选(7):翻转句子中单词的顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于

2007-10-24 14:16:00 1839 1

转载 程序员面试题精选(6):判断整数序列是不是二元查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:         8       /  /      6    10    / /    / /   5   7   9  11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结

2007-10-24 14:09:00 1950

转载 程序员面试题精选(5):查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,

2007-10-24 14:03:00 2146 2

转载 程序员面试题精选(4):在二元树中找出和为某一值的所有路径

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树                                            10                                           /   /                      

2007-10-24 14:01:00 2932

转载 程序员面试题精选(3):求子数组的最大和

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年

2007-10-24 13:52:00 3723 3

转载 程序员面试题精选(2):设计包含min函数的栈

题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放

2007-10-24 13:46:00 3397

转载 程序员面试题精选(1):把二元查找树转变成排序的双向链表

  题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。  比如将二元查找树                                            10                                          /    /                                     

2007-10-24 13:34:00 5486 7

原创 几道面试题的求解

给定九个数,例如:1,3,3,5,6,7,8,8,9计算出这九个数的排列的种数。需要考虑重复情况,如果给定9个1,则只有一种结果。 限制:不能使用stl库 要求:完成函数 unsigned int foo(unsigned int *arr); 输入算法代码,并给出算法复杂度分析。分析: #include #include using namespace std;unsigned in

2007-10-24 10:24:00 2181

原创 求大数据量数组中不重复元素的个数

有2.5亿个整数(这2.5亿个整数存储在一个数组里面,至于数组是放在外存还是内存,没有进一步具体说明); 要求找出这2.5亿个数字里面,不重复的数字的个数(那些只出现一次的数字的数目); 另外,可用的内存限定为600M; 要求算法尽量高效,最优;1. caoxic的算法BYTE    marks[2^29];//512M   // BYTE marks[2^32/8]; //用这个就更清楚了,

2007-10-23 19:31:00 4222 2

转载 求n!末尾0的个数

思考: 该题实际上是求(2 5)因子对的个数。对于任意一个阶乘,5因子的个数总是小于2因子的个数,仅需考虑n!中5因子的个数方法:   (1) 将该数用 5 除, 得到的商取整数。   (2) 然后再用所得商当被除数除以 5,得到的商取整数。   (3) 持续做到商等于 0 为止。   (4) 过程中的商加总即为阶乘的尾数 0 的个数。    例: 1234! 的尾数 0 的个数计算如下: 代

2007-10-03 16:26:00 1418

原创 国庆节的前一天,保研复试顺利过关

七天长假可以好好玩下了 

2007-10-01 16:48:00 1434

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除