解题笔记
文章平均质量分 74
wuzhekai1985
这个作者很懒,什么都没留下…
展开
-
解题笔记(2)——部分面试题解题思路
这几天在网上看到一篇关于算法面试题的博客,归纳的很好,有不少经典的题目,大部分来自《编程珠玑》、《编程之美》、《代码之美》三本书。这里给出书上的解答以及一些思考。如有不对的地方,希望得到高手的指点。【一】 时间受限大部分的面试题,都是对时间复杂度有所要求的,如果有涉及,“最快”一原创 2011-07-11 15:30:48 · 10294 阅读 · 6 评论 -
解题笔记(20)——判断二叉树是不是平衡的
问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树: 思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只原创 2011-07-29 10:09:18 · 6440 阅读 · 0 评论 -
解题笔记(6)——在二元树中找出和为某一值的所有路径(树)
问题描述:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / / 5 12 / / 4 7则打印原创 2011-07-19 22:23:26 · 3980 阅读 · 0 评论 -
有点意思的C/C++问题及解答:16-20
问题16:在C++中定一个不能被继承的类 解法:容易想到的就是将这个类的构造函数和析构函数都设为私有的。这样继承的类就无法调用父类的构造函数和析构函数,编译时就会报错。但是不能被继承的类如何产生对象呢?可以利用静态函数,它与类的对象无关,可以直接通过类的作用域直接原创 2011-08-04 16:14:23 · 2842 阅读 · 0 评论 -
有点意思的C/C++问题及解答:6-10
问题 6:非C++内建型别A 和B,在哪几种情况下B 能隐式转化为A? (1)class A { ...... }; class B : public A { ……} ; // B 公有继承自A,可以是间接继承的(2)class A { ...... }; class原创 2011-07-23 16:36:18 · 2673 阅读 · 0 评论 -
有点意思的C/C++问题及解答:11-15
问题11:下面这个函数希望完成什么任务?int func(int x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 解答:这个函数是原创 2011-07-23 16:19:01 · 2713 阅读 · 1 评论 -
解题笔记(8)——翻转句子中单词的顺序
问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。 思路:先逆转整个句子,然后从首字符开原创 2011-07-20 14:32:06 · 4511 阅读 · 1 评论 -
解题笔记(19)——数对之差的最小值
问题描述:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。 思路:这又是一道动态规划的题目,这是我能想到的最好方法,时间复杂度为O原创 2011-07-29 09:08:51 · 3072 阅读 · 1 评论 -
解题笔记(22)——n后问题
问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后。即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。原创 2011-07-29 16:05:08 · 2785 阅读 · 0 评论 -
解题笔记(30)——找含单链表的环入口点(转网上某位高手的解法)
原文出处 http://hi.baidu.com/iwitggwg/blog/index/1 很不错。 问题1:如何判断单链表中是否存在环(即下图中从结点E到结点R组成的环)? 设一快一慢两个指针(Node *fast, *low)同时从转载 2011-08-27 20:22:37 · 27156 阅读 · 15 评论 -
解题笔记(18)——n个骰子的点数
问题描述:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 思路:这是一道应用动态规划思想的题目,而动态规划最难的就是要找最优子结构。并采取一种称为备忘录的方法避免重复计算。因为备忘录方法为每个解过的子问题建立了备原创 2011-07-28 12:57:26 · 4489 阅读 · 0 评论 -
有点意思的C/C++问题及解答:1-5
问题1 :写一个交换两个数的宏方法1:可以用异或运算来做,如果是浮点数,这个方法就不行了#define _swap(a,b) { a=a^b; b=a^b;a=a^b; }方法2:用加减法来做,可能会溢出#define _swap(a,b) { a=a原创 2011-07-23 13:57:27 · 3378 阅读 · 1 评论 -
解题笔记(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 · 5213 阅读 · 4 评论 -
解题笔记(38)——大整数阶乘计算
问题描述:求一个整数 n 的阶乘,0 比如n = 50,结果为30414093201713378043612608166064768844377641568960512000000000000 思路:从阶乘的定义出发,n! = n * (n-原创 2011-10-05 22:36:03 · 10269 阅读 · 8 评论 -
解题笔记(40)——第1-39篇合集
2011年7月至今,解题笔记系列已有39篇文章,本文做一个归纳及索引,方便网友阅读参考。其中的题目多出自两个博客,一个是JULY的,另一个是何海涛的。上面有题目,也有解题思路及代码。 JULY的博客 http://blog.csdn.net/v_JULY_v/ar原创 2011-10-07 11:09:06 · 21643 阅读 · 26 评论 -
解题笔记(39)——过河问题
问题描述:在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那原创 2011-10-06 16:05:29 · 14875 阅读 · 5 评论 -
解题笔记(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 · 15112 阅读 · 4 评论 -
解题笔记(35)——旋转数组中的最小元素
问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 思路:这道题最直观的解原创 2011-08-30 21:58:51 · 12324 阅读 · 4 评论 -
解题笔记(32)——输入一颗二元查找树,将该树转换为它的镜像
问题描述:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / / 6 10 //原创 2011-08-29 14:37:29 · 12063 阅读 · 4 评论 -
解题笔记(31)——从数列1,2...n中随意取几个数,使其和等于m
问题描述:输入两个整数n和m,从数列1,2.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来。 思路:这个问题其实背包问题的变形,本文给出两种解法。 解法一:用递归,效率可能低了点。假设问题的解为F(n, m)原创 2011-08-29 11:37:21 · 21150 阅读 · 4 评论 -
有点意思的C/C++问题及解答:21-25
问题21:判断C编译器是否支持嵌套注释。 解法:嵌套注释是指在/* */ 中出现/* ... */,定义这个式子: /*/*/0*/**/1 。如果编译器不支持嵌套注释,那么这个式子为0*1。如果支持嵌套注释,那么这个式子为1。摘自《C陷阱与缺陷》。原创 2011-08-28 15:26:46 · 7787 阅读 · 1 评论 -
解题笔记(27)——找数组中的特定元素
问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 思路:如果能用两个辅助数组,那么相对来说简单一点,可定义数组Min和数组Max,其中Min[i原创 2011-08-24 21:19:44 · 8675 阅读 · 1 评论 -
解题笔记(4)——把二元查找树转变成排序的双向链表
问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 思原创 2011-07-15 20:50:57 · 6230 阅读 · 2 评论 -
解题笔记(24)——找出数组中两个只出现一次的数字(数组)
问题描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 思路:如果只有一个数字只出现一次,而其他都出现两次,则直接将所有数字做一次异或运算即可,因为相等的数字异或一下结果为原创 2011-08-20 18:57:03 · 13701 阅读 · 1 评论 -
解题笔记(21)——字符串的排列组合问题
问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环原创 2011-07-29 14:48:30 · 29102 阅读 · 11 评论 -
解题笔记(16)——几个数字的问题
问题1:整数的二进制表示中1的个数。问题2:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。问题3:输入一个正数n,输出所有和为n连续正数序列。问题4:调整数组顺序使奇数位于偶数前面(数组)。 问题5:寻找丑数。我们把只包含因子2、3和5的数称作丑数原创 2011-07-27 22:48:12 · 3875 阅读 · 3 评论 -
解题笔记(7)——判断整数序列是不是二元查找树的后序遍历结果
问题描述:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / / 6 10 / / /原创 2011-07-20 14:49:25 · 5453 阅读 · 0 评论 -
解题笔记(17)——扑克牌的顺子
问题描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 思路:可以将这5张牌排个序,然后统计出0的个数以及非0数字之间的间隔数,如果出现重复的非0数字,那么原创 2011-07-28 10:30:09 · 5276 阅读 · 2 评论 -
解题笔记(15)——几个栈和递归的问题
问题1:跳台阶问题。问题2:栈的push、pop序列。问题3:二元树的深度。问题4:颠倒栈。用递归颠倒一个栈。问题5:设计包含min函数的栈。定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。原创 2011-07-26 17:20:11 · 3776 阅读 · 5 评论 -
解题笔记(12)——用两个栈实现队列
问题描述:用两个栈来实现队列,有如下声明: 思路:栈是先进后出,而队列是先进先出。可以这样设计,一个栈用于入队列操作,设为Stack1,另一个栈用于出队列操作,设为Stack2。入队列可以在常数时间内完成,即Stack1的入栈操作。而出队列时,若Stack2的元素原创 2011-07-24 21:26:07 · 3429 阅读 · 2 评论 -
解题笔记(13)——几个链表的问题
问题1:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。问题2:输入一个链表的头结点,从尾到头反过来输出每个结点的值。问题3:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。问题4:两个单向链表,找出它们的第一个公共结点。原创 2011-07-25 14:28:44 · 4548 阅读 · 5 评论 -
解题笔记(10)——约瑟夫环问题
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。 思路:容易想到的就是用环链表来做,构建一个环链表,每个结点的编号为0, 1, ...... n-1。每次从当前位置向前移动m-1步,然后删除原创 2011-07-24 10:00:04 · 57424 阅读 · 5 评论 -
解题笔记(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 · 4225 阅读 · 3 评论 -
解题笔记——前言
网上有很多经典的面试题,大都出自微软、Google、百度这样的公司,很多题目都有解答。原创 2011-07-15 20:33:53 · 2106 阅读 · 0 评论 -
解题笔记(36)——最大公约数问题
问题描述:求两个正整数的最大公约数。 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0)。根据通式写出算法不难,这里原创 2011-09-05 20:37:39 · 9242 阅读 · 0 评论 -
解题笔记(25)——把数组排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依原创 2011-08-21 10:40:51 · 20738 阅读 · 9 评论 -
解题笔记(29)——珠子问题
问题描述:一串首尾相连的珠子(n个),有N种颜色(N 思路:可以利用一种计数的方法。定义两个指针p1和p2,主要有三个步骤: (1)p1向前移动,如果p1所指的珠子颜色编号为 i ,则增加 i 的出现次数。当出现的颜色种数为N时,p1停止原创 2011-08-27 12:43:30 · 9274 阅读 · 2 评论 -
解题笔记(30)——找含单链表的环入口点
问题描述:有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。如果链表存在环,找到环的入口点? 思路:这道题的原型可能来自《C专家编程》一书,题目为”怎样才能检测到链表中存在循环“,书中给出的最终算原创 2011-08-27 16:17:20 · 9489 阅读 · 2 评论 -
解题笔记(26)——排队问题
问题描述:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 思路:可以用递归来解决。假设已按高矮顺序编号从0到11,即0号最矮、11号最高,(i, j)表示某个人在队列中的位置。对于0号只能排在(0, 0原创 2011-08-23 21:45:29 · 8449 阅读 · 4 评论 -
解题笔记(28)——寻找捣乱分子对
问题描述:多人排成一个队列,我们认为从低到高是正确的序列,但是总有部分人不遵守秩序。如果说,前面的人比后面的人高(两人身高一样认为是合适的),那么我们就认为这两个人是一对“捣乱分子”,比如说,现在存在一个序列:176, 178, 180, 170, 171 这些捣乱原创 2011-08-25 14:25:55 · 9939 阅读 · 0 评论