解题笔记
文章平均质量分 73
网上有很多经典的面试题,大都出自微软、Google、百度这样的公司,很多题目都有解答。本人自己实现了一下,同时收集了一些其他的算法题。贴在博客上算是一个备份,方便以后查阅,同时也供各位网友参考。
wuzhekai1985
这个作者很懒,什么都没留下…
展开
-
解题笔记(37)——Catalan数计算及应用
问题描述:卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。输入一个整数n,计算h(n)。其递归式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 该递推关原创 2011-09-10 09:17:11 · 31972 阅读 · 19 评论 -
解题笔记(36)——最大公约数问题
问题描述:求两个正整数的最大公约数。 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0)。根据通式写出算法不难,这里原创 2011-09-05 20:37:39 · 9221 阅读 · 0 评论 -
解题笔记(35)——旋转数组中的最小元素
问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 思路:这道题最直观的解原创 2011-08-30 21:58:51 · 12303 阅读 · 4 评论 -
解题笔记(34)——求最长单调递减子序列
问题描述:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。 思路:这是很经典的一个问题,用动态规划解决。假设源数组为A,定义一个辅助数组为B,B[i]表示以A[i]结尾的最长递减序列的长度。举个简单原创 2011-08-30 19:41:02 · 15086 阅读 · 4 评论 -
解题笔记(33)——按层次遍历二元树
问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / / 6 10/ / / /5 7 9 11输出8 6 10 5 7 9 11。原创 2011-08-29 19:13:07 · 18202 阅读 · 1 评论 -
解题笔记(32)——输入一颗二元查找树,将该树转换为它的镜像
问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / / 6 10 //原创 2011-08-29 14:37:29 · 12031 阅读 · 4 评论 -
解题笔记(31)——从数列1,2...n中随意取几个数,使其和等于m
问题描述:输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来。 思路:这个问题其实背包问题的变形,本文给出两种解法。 解法一:用递归,效率可能低了点。假设问题的解为F(n, m)原创 2011-08-29 11:37:21 · 21102 阅读 · 4 评论 -
解题笔记(30)——找含单链表的环入口点(转网上某位高手的解法)
原文出处 http://hi.baidu.com/iwitggwg/blog/index/1 很不错。 问题1:如何判断单链表中是否存在环(即下图中从结点E到结点R组成的环)? 设一快一慢两个指针(Node *fast, *low)同时从转载 2011-08-27 20:22:37 · 27137 阅读 · 15 评论 -
解题笔记(30)——找含单链表的环入口点
问题描述:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。如果链表存在环,找到环的入口点? 思路:这道题的原型可能来自《C专家编程》一书,题目为”怎样才能检测到链表中存在循环“,书中给出的最终算原创 2011-08-27 16:17:20 · 9466 阅读 · 2 评论 -
解题笔记(29)——珠子问题
问题描述:一串首尾相连的珠子(n个),有N种颜色(N 思路:可以利用一种计数的方法。定义两个指针p1和p2,主要有三个步骤: (1)p1向前移动,如果p1所指的珠子颜色编号为 i ,则增加 i 的出现次数。当出现的颜色种数为N时,p1停止原创 2011-08-27 12:43:30 · 9236 阅读 · 2 评论 -
解题笔记(28)——寻找捣乱分子对
问题描述:多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:176, 178, 180, 170, 171 这些捣乱原创 2011-08-25 14:25:55 · 9907 阅读 · 0 评论 -
解题笔记(27)——找数组中的特定元素
问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i原创 2011-08-24 21:19:44 · 8659 阅读 · 1 评论 -
解题笔记(26)——排队问题
问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 思路:可以用递归来解决。假设已按高矮顺序编号从0到11,即0号最矮、11号最高,(i, j)表示某个人在队列中的位置。对于0号只能排在(0, 0原创 2011-08-23 21:45:29 · 8393 阅读 · 4 评论 -
解题笔记(25)——把数组排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依原创 2011-08-21 10:40:51 · 20689 阅读 · 9 评论 -
解题笔记(24)——找出数组中两个只出现一次的数字(数组)
问题描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 思路:如果只有一个数字只出现一次,而其他都出现两次,则直接将所有数字做一次异或运算即可,因为相等的数字异或一下结果为原创 2011-08-20 18:57:03 · 13676 阅读 · 1 评论 -
解题笔记(23)——一个线程竞争的问题
下面这个程序存在竞争,当对等线程执行 int myid = *((int *)argv) 前,如果主线程先执行了 i++,那么对等线程的执行结果是不正确。#include #include #define N 100void *thread(void *arg原创 2011-08-13 22:03:28 · 2176 阅读 · 0 评论 -
解题笔记(22)——n后问题
问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。原创 2011-07-29 16:05:08 · 2761 阅读 · 0 评论 -
解题笔记(21)——字符串的排列组合问题
问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环原创 2011-07-29 14:48:30 · 29030 阅读 · 11 评论 -
解题笔记(20)——判断二叉树是不是平衡的
问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树: 思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只原创 2011-07-29 10:09:18 · 6412 阅读 · 0 评论 -
解题笔记(19)——数对之差的最小值
问题描述:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。 思路:这又是一道动态规划的题目,这是我能想到的最好方法,时间复杂度为O原创 2011-07-29 09:08:51 · 3045 阅读 · 1 评论 -
解题笔记(18)——n个骰子的点数
问题描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 思路:这是一道应用动态规划思想的题目,而动态规划最难的就是要找最优子结构。并采取一种称为备忘录的方法避免重复计算。因为备忘录方法为每个解过的子问题建立了备原创 2011-07-28 12:57:26 · 4466 阅读 · 0 评论 -
解题笔记(17)——扑克牌的顺子
问题描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 思路:可以将这5张牌排个序,然后统计出0的个数以及非0数字之间的间隔数,如果出现重复的非0数字,那么原创 2011-07-28 10:30:09 · 5228 阅读 · 2 评论 -
解题笔记(16)——几个数字的问题
问题1:整数的二进制表示中1的个数。问题2:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。问题3:输入一个正数n,输出所有和为n连续正数序列。问题4:调整数组顺序使奇数位于偶数前面(数组)。 问题5:寻找丑数。我们把只包含因子2、3和5的数称作丑数原创 2011-07-27 22:48:12 · 3849 阅读 · 3 评论 -
解题笔记(15)——几个栈和递归的问题
问题1:跳台阶问题。问题2:栈的push、pop序列。问题3:二元树的深度。问题4:颠倒栈。用递归颠倒一个栈。问题5:设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。原创 2011-07-26 17:20:11 · 3755 阅读 · 5 评论 -
解题笔记(14)——几个字符串的问题
字符串问题是面试中经常出现的问题,这类问题有很多,难以不一。下面是几道字符串的题目,网上都能找到解答,自己实现了一下,供网友参考。感觉算法重要的是要有正确的思路,实现起来不是问题。自己一定要多思考,这样收获可能会更多一点。 问题1:找两个字符串的最长公共子串。原创 2011-07-25 21:21:44 · 6386 阅读 · 6 评论 -
解题笔记(13)——几个链表的问题
问题1:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。问题2:输入一个链表的头结点,从尾到头反过来输出每个结点的值。问题3:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。问题4:两个单向链表,找出它们的第一个公共结点。原创 2011-07-25 14:28:44 · 4524 阅读 · 5 评论 -
解题笔记(12)——用两个栈实现队列
问题描述:用两个栈来实现队列,有如下声明: 思路:栈是先进后出,而队列是先进先出。可以这样设计,一个栈用于入队列操作,设为Stack1,另一个栈用于出队列操作,设为Stack2。入队列可以在常数时间内完成,即Stack1的入栈操作。而出队列时,若Stack2的元素原创 2011-07-24 21:26:07 · 3407 阅读 · 2 评论 -
解题笔记(11)——字符串转换为整数
问题描述:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。 思路:转换的过程比较简单,每次读入一个字符,将之前保存的值乘以10,然后再加上这个字符表示的数字。这是正常情况。这个问题主要是考察各种不正常情况的处理。假原创 2011-07-24 16:42:49 · 4078 阅读 · 3 评论 -
解题笔记(10)——约瑟夫环问题
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。 思路:容易想到的就是用环链表来做,构建一个环链表,每个结点的编号为0, 1, ...... n-1。每次从当前位置向前移动m-1步,然后删除原创 2011-07-24 10:00:04 · 57361 阅读 · 5 评论 -
解题笔记(9)——提取某日访问次数最多的那个IP
问题描述:从海量数据日志中,提取出某日访问次数最多的那个IP。 思路:对于海量数据的处理,主要采取的策略就是分而治之,即缩减问题的规模,将一个大的问题划分成若干等价的小问题。然后解决这些小问题,最后将获得的小问题解综合起来,得出原问题的解。用到比较多的技术主要有散列原创 2011-07-22 16:02:41 · 3697 阅读 · 3 评论 -
解题笔记(8)——翻转句子中单词的顺序
问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。 思路:先逆转整个句子,然后从首字符开原创 2011-07-20 14:32:06 · 4486 阅读 · 1 评论 -
解题笔记(7)——判断整数序列是不是二元查找树的后序遍历结果
问题描述:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / /原创 2011-07-20 14:49:25 · 5437 阅读 · 0 评论 -
解题笔记(6)——在二元树中找出和为某一值的所有路径(树)
问题描述:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / / 5 12 / / 4 7则打印原创 2011-07-19 22:23:26 · 3952 阅读 · 0 评论 -
解题笔记(5)——CPU占用率固定为50%
解题思路: 要控制CPU的使用率曲线,可以让CPU跑busy和idle两个不同的循环。busy循环可以执行一个空循环,idle可以调用Sleep调用实现。 程序的关键在于设定空循环的执行次数,这与CPU的主频存在关系。假设CPU的主频为2.33GHz,CPU每个周期平均可以执行2条指令,一个空循环的指令条数为5条,那么循环次数n的计算方式为n原创 2011-01-09 21:28:00 · 5176 阅读 · 4 评论 -
解题笔记(4)——把二元查找树转变成排序的双向链表
问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 思原创 2011-07-15 20:50:57 · 6191 阅读 · 2 评论 -
解题笔记(3)——随机数选择
问题: 从0, 1 ,2 ... n-1中随机选择m个数,每个数选中的概率要求一样,而且不允许重复。选中的数按顺序输出。比如,0, 1, 2, 3, 4, 5中随机选3个数,如果选的是1,4, 5,那么输出的顺序也应该是1, 4, 5。《编程珠玑》上的解法一void random原创 2011-07-15 15:42:12 · 4189 阅读 · 3 评论 -
解题笔记(2)——部分面试题解题思路
这几天在网上看到一篇关于算法面试题的博客,归纳的很好,有不少经典的题目,大部分来自《编程珠玑》、《编程之美》、《代码之美》三本书。这里给出书上的解答以及一些思考。如有不对的地方,希望得到高手的指点。【一】 时间受限大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一原创 2011-07-11 15:30:48 · 10246 阅读 · 6 评论 -
解题笔记(1)——子数组之和的最大值
求子数组之和的最大值是一个很经典的问题。问题的描述如下:一个有N个整形数的一维数组(A[0], A[1], ... A[n-1]),这个数组有很多子数组,那么子数组之和的最大值是什么呢? 这个问题的解答其实在《编程珠玑》一书有的。一共是4中方法:第一种是穷举法原创 2011-07-13 21:23:17 · 4168 阅读 · 0 评论 -
解题笔记——前言
网上有很多经典的面试题,大都出自微软、Google、百度这样的公司,很多题目都有解答。原创 2011-07-15 20:33:53 · 2083 阅读 · 0 评论