05 2014 档案
摘要:【面试题042】翻转单词顺序VS左旋转字符串题目一: 输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。 例如输入字符串“I am a student.”,则输出“student. a am I”。思路一: 反转字符串的顺序,这样子每个单词...
阅读全文
摘要:【面试题041】和为s的两个数字VS和为s的连续正数序列题目一: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。思路一: 现在数组中固定一个数字,再依次判断数组中其他的n-1个数字与它的和是不是等于s,——时间复杂度O(...
阅读全文
摘要:【面试题040】数组中只出现一次的数字题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路一: 考虑,只有一个元素出现一次的情况,任何一个数字异或自己都得0,也就是说我们从头到位异或每个元素,那么...
阅读全文
摘要:【面试题039】二叉树的深度题目一: 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树结点的结构如下:123456structBinaryTreeNode{intm_nValue;BinaryTreeNode*m...
阅读全文
摘要:【面试题038】数字在排序数组中出现的次数题目: 统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路一: 利用二分查找法,找到这个数字,然后在奇拿后遍历得到这个数字的个数。——时间复杂度是O...
阅读全文
摘要:【面试题037】两个链表的第一个公共结点题目: 输入两个链表,找出它们的第一个公共结点。链表结点定义如下:12345structListNode{intm_nKey;ListNode*m_pNext;}思路一: 蛮力法,在第一个链表上面遍历,对每个遍历到的结点,我们都在第二个链表上面顺序遍历。如...
阅读全文
摘要:【面试题036】数组中的逆序对题目: 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对的总数。思路一: 遍历扫描整个数组,没扫描到一个数字的时候,逐个比较这个数字和它后面的数字的大小。 如果后面的数字比它小,则这两个数字就组...
阅读全文
摘要:【面试题035】第一个只出现一次的字符题目: 在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。思路一: 从头遍历字符串,每遍历一个字符就和后面的字符做比较,如果没有发现后面出现相同的字符,那么这个时候还挺复杂的,例如上面的字符串,第一个a发现后面有a,但是第二个...
阅读全文
摘要:【面试题034】丑数题目: 我们把只包含因子2、3和5的数称为丑数(Ugly Number)。 求按从小到大的顺序的第1500个丑数。 例如6、8都是丑数,但14不是,因为他包含因子7。习惯上我们把1当做第一个丑数。思路一: 逐个的判断,效率不高。1234567891011121314151...
阅读全文
摘要:【面试题033】把数组排成最小的数题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个。 例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。思路一: 最直观的想法是求出所有数字的全排列,然后取最小值即可, ...
阅读全文
摘要:【面试题032】从1到n整数中1出现的次数题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1出现了5次。思路一: 对每一个数字做判断,把1出现的数字累加。 可以通过对10取余,判断这个数字个位上的...
阅读全文
摘要:【面试题031】连续子数组的最大和题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。要求时间复杂度为O(n)。思路一: 枚举出数组的所有子数组并求出他们的和,最快也需要O(n^2)的时间,思路二: 举例分析数组的规律,如果加...
阅读全文
摘要:【面试题030】最小的k个数题目: 输入n个整数,找出其中最小的k个数。 例如输入4、5、1、6、2、7、3、8这8个字,则其中最小的4个数字是1、2、3、4。思路一: 可以同样的基于随机快速排序的Partition函数,来对数组做划分, 基于k来作调整,返回调用Partition函数,直到...
阅读全文
摘要:【面试题029】数组中出现次数超过一半的数字题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.思路一: 对数组排序最快O(n*l...
阅读全文
摘要:【面试题028】字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有的字符串abc,acb,bac,bca,cab和cba。StringPermutation.cppC++ Code12345678910111213141...
阅读全文
摘要:【面试题027】二叉搜索树与双向链表题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调用书中结点的指向。二叉树的结点定义如下:C++ Code123456structBinaryTreeNode{intm_nValue;BinaryTreeNode...
阅读全文
摘要:【面试题026】复杂链表的复制请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如...
阅读全文
摘要:【面试题025】二叉树中和为某一值的路径只有前序遍历,首先访问根结点。前序遍历访问到某个结点,把该结点添加到路径上,并累加该结点的值,递归函数推出前,要在路径上删除当前结点,并且减去当前结点的值,递归返回的条件是到了叶子结点。保存路径的数据结构实际上就是一个栈。PathInTree.cpp:1234...
阅读全文
摘要:【面试题024】二叉搜索树的后序遍历序列解决树的问题就是分析,怎么把树的结构一点一点变小,变成子树,问题的域一直在变小,然后怎么递归的解决这个子问题,递归这个子问题的返回条件是什么。先找到二叉树的根结点,再基于根结点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归的处理这...
阅读全文
摘要:【面试题023】从上往下打印二叉树层次遍历二叉树就是队列的应用树是图的一种特殊退化形式,从上到下按层次遍历二叉树,从本质上来说就是广度优先遍历二叉树。PrintTree.cpp:1234567891011121314151617181920212223242526272829303132333435...
阅读全文
摘要:【面试题022】栈的压入、弹出序列如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,StackPushPop.cpp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849...
阅读全文
摘要:【面试题021】包含min函数的栈MinStack.cpp:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include#include"StackWithMin.h"#in...
阅读全文
摘要:【面试题020】顺时针打印矩阵输入一个矩阵,按照从外到里的顺序打印出每一个数字,如果只有一行,那么就不用第二步了,第二步的前提条件是终止行号大于起始行号。第三步的前提条件是圈内至少要有两行两列,也就是说除了终止行号要大于起始行号外,还要求终止利好大于起始列号;同理第四步的前提条件是要有三行两列,因此...
阅读全文
摘要:【面试题019】二叉树的镜像这道题很简单就是交换结点,利用递归解解决问题思路清晰,代码简洁;MirrorTree.cpp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849...
阅读全文
摘要:【面试题018】树的子结构输入两个二叉树A,B,判断B是不是A的子结构,SubTree.cpp:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555...
阅读全文
摘要:【面试题017】合并两个排序的链表两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。MergeList.cpp:1234567891011121314151617181920212223242526272829303132333435363738394041424344454...
阅读全文
摘要:【面试题016】反转链表定义一个函数,输入一个链表的头结点,反转该链表并且输出反转后链表的头结点;我们定义三个指针,分别指向当前遍历到的结点,她的前一个结点,她的后一个结点;RevList.cpp:123456789101112131415161718192021222324252627282930...
阅读全文
摘要:【面试题015】链表中倒数第k个结点可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动,当第一个指针移动到末尾的时候,第二个指针指向的就是倒数第K个结点;两个指针的间距保持为k-1;当我们遍历列表的时候发现用一个指针是解决不了问题的,我们可...
阅读全文
摘要:【面试题014】调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数 位于 数组的前半部分,所有偶数位于数组的后半部分。1.第一个指针初始化为指向数组的第一个数字,他向后移动2.第二个指针初始化为指向数组的最后一个数字,他向前面移动,3.在两个指针相...
阅读全文

浙公网安备 33010602011771号