
zjof
文章平均质量分 67
huoyao
ZJNU,zz
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ
本题中开始思考发现有些棘手,不能用乘除法,但我们需要发现关键是我们可以用加减法,但加减法有一个问题,我们不能使用条件语句,也就意味我们不能轻易终止累加。那么我们想的是否有其他的操作可以替换条件语句来完成终止条件的任务,此时我们脑海里面只有逻辑操作这个候选了。是的,我们可以巧妙的利用0 和 && 的逻辑操作来作为终止条件。那么我们就可以轻易的设置一个递归函数,然后用&&来作为终止条件,完成任务。原创 2014-12-25 21:22:02 · 1279 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
本题很容易想到用map和set数据结构来完成。但map的构建和最后对map的查询需要的时间代价很大,但空间和时间应该是不允许的。综合查询操作和数组的有序的特点,我们采用二分查找来确定元素是否在数组里面。若在数组里面,则将其周围的元素的个数统计完成后输出。原创 2014-12-24 21:01:56 · 1043 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ
本题当然不能用遍历的思想来解答,因为这样分类过多。根据题目的求和特点,我们应该想到公差为1的等差数列的求和,现在情况是和与公差已知,所以给定初始值和元素的个数两个变量中间的任意一个就可以求另外一个,这样题目的结果就出来了。 那么我们应该假定初始值还是个数呢,显然假定个数所要处理的情况更少,因为假定初始值,我们需要一直从1开始遍历到所给定的和近一半的数,耗时很大。所以我们确定个数,最大的个数应该就是当初始值取1时的个数。然后我们从最大的个数出发,依次将个数减一,若计算得到的初值为整数我们就找到了一个序原创 2014-12-24 21:46:44 · 1581 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1283:第一个只出现一次的字符--九度OJ
本题有很多思路可以做,包括map set 排序等应用,但,时间却是个问题。既然提到了字母,我们不妨用最原始的方法,统计每个字母出现的次数,然后按照字母的输入次序遍历26个字母,当某一个字母的次数为1则该字母为所求,否则不存在这样的字母。原创 2014-12-23 23:00:09 · 746 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1214:丑数--九度OJ
本题最直观的想法就是从1开始遍历,然后判断每一个数是否为丑数,但这样肯定是一种非常耗时间的做法,不可取。那么我们是否可用从丑数的特点出发呢,从另一个角度来思考问题,我们可以用2 3 5这三个数相乘来组成丑数,我们唯一需要确保的就是我们组成的丑数是按从小到大的关系出现的。我们可以想象一个丑数的出现是前面某一个丑数乘以2 /3 /5的结果,所以我们可以维护三个index,分别对应是2 3 5下一个应该相乘的数,然后依次去这三个数的最小值作为下一个丑数,并更新三个index。如此继续迭代。原创 2014-12-23 21:27:52 · 682 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1504:把数组排成最小的数--九度OJ
这道题目首先需要看破的一点就是我们需要用字符串来处理,因为当数字拼接是很容易超过机器最大数。另外,我们需要从最简单、最原始的想法出发,来判断数字应该怎么拼接。我们可以想象成对给定的一堆字符串排序,使得最后的排序结果拼接后具有最小值,那么问题就转化为两个字符串谁前谁后的问题。问题已经很明了了,我们可以直接拼接两个字符串a,b成ab和ba。当a放前面拼接后的结果小则a应该放前面,否则b应该放前面。原创 2014-12-23 21:17:52 · 837 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1373:整数中1出现的次数--九度OJ
对于给定一个数,算包含的1的个数,我们可以将这个数分为很多部分,然后分别算1的个数。首先我们很容易得到一个n位数中1的个数,n位数1的个数等于n-1位数中1的个数与10相乘加上第n位为1的额外增加的个数pow(10,n-1)。 例如给定101,可以从第一位开始计算,首先是两位数0-99中1的个数,然后是100 101中首位1的个数,然后到第二位0,不计算。第三位1,计算0位数1个数0个,然后计算1这个数1的个数为1。最后将所有计算结果相加。原创 2014-12-23 20:57:05 · 1232 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1372:最大子向量和--九度OJ
这应该是一个非常经典的问题了,看到这种最后化问题,而且各结果之间具有一定的联系的题型,第一反应就是dp问题,因为一个数我们能确定,两个数的话我们可以根据一个数确定,同理第三个数出现后我们能根据前面的数确定。用一个数组记录到当前元素为止的最大和,并记录其起始元素编号。同时寻找最大值。原创 2014-12-22 23:03:39 · 723 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1369:字符串的排列--九度OJ
由于需要字典序,首先肯定是要先对所给的字符串进行排序,然后很容易想到穷举法,但这边穷举法还有要避免重复,所以,有一定的技巧。我们有三个元素abb,最后输出时三元组,则我们可以将三个位置都看做由所有元素来填充的序列。负责度应该是一个n的n次方,但中间可以有一些剪枝。 由于n的大小不固定,我们没法确定是几层循环,所以只能用递归操作来进行遍历。对每一次递归调用都遍历n个元素哪个适合加入到结果队列res中,同时,我们设置一个used变量来控制某个元素是否已经在res中,避免重复添加。当检测到res的长度原创 2014-12-22 22:00:09 · 748 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
这道题目主要还是题目的意思有点混淆不清吧,所谓的输出“第二个代表当前节点的特殊指针的值”,很有可能理解成当前节点的指针值,也就是元素的编号。但实际是指针所指的元素的值。题目当然肯定是很简单的,只需要利用两个vector存下元素的值和指针值,然后输出的利用元素的下标即元素的编号也即指针值处理就好。原创 2014-12-22 20:36:06 · 641 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1371:最小的K个数--九度OJ
本题首先想到的是利用二分查找确定一个元素的位置,然后比较这个位置是在k之前还是之后,若这个位置等于k则停止,否则继续在分开的两个子区间里面确定k位置的元素,直到确定k位置元素后停止。然后对前k个元素排序即可得到前k个有序序列。 但考虑到上面的做法代码比较复杂,且要求通用的话,时间复杂度也挺高。所以决定用一个笨办法试试,直接对所有元素排序,然后取前k个元素输出即可。原创 2014-12-22 22:47:08 · 610 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1370:数组中出现次数超过一半的数字--九度OJ
这道题目需要注意的一点就是:比较容易和另外一个题目相混淆,另外一个题目是从一堆数中找到出现次数超过一半的那个数,可以利用一次遍历找到。 但本题却是要完成两个任务:确定是否存在那个数+找出那个数。所以本题没法在O(N)的时间复杂度情况下完成,当然本题的解题方法有很多,但都是得好好利用这个出现次数超过一半这一特性。首先必须明确,我们队数组排序后,因为如果存在这个数,则中间元素肯定就是那个要找的值。其中一个解法:首先将数字排序,然后取中间元素值,统计有多少个元素等于中间元素值。若统计的结果比一半小,原创 2014-12-22 22:33:51 · 837 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ
本题应该非常经典的题目了,但这种题目我们往往有时候需要注意来输入的不止两个链表的情况,但本题目中已经很清晰的说明了只有两个链表。另外,既然是单链表,就不存在有一个节点具有多个指针指向其他节点。 那么本题还是采用经典的尾部对其的做法,使两个链表尾部对齐后,两个链表同时开始向后扫描,若发现有一个元素值相同则表明两个链表具有相同的节点,后面的节点也就不同扫描了。若扫描完所有的节点都没有找到相同的节点,则表明两个链表不具有共同元素。原创 2014-12-24 20:50:41 · 801 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1361:翻转单词顺序--九度OJ
本题应该是传统的题型的变形,我们可以先读入一行,然后从最后的字符开始处理,对于字符串我们使之逆序输出,对于空格原样输出。 本题注意两点:空格需要原样输出,不管有多少个;另外,利用gets函数读入一行效率要比getline更高。原创 2014-12-24 22:12:08 · 947 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
本题应该难度不大,首先我们输入一个字符串,然后判断首位,若为符号则需要标记一下,若为数字则加入到结果中,若为其他的证明这个不是合法的字符串不需要往下处理。然后就是后面的字符处理,只需要接纳数字字符,遇到其他字符证明需要停止接纳了。最后输出结果即可。原创 2014-12-25 22:14:54 · 1250 阅读 · 3 评论 -
【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
求和而不用四则运算,我们可能需要联想到加法的机器实现,机器实现当然原理和位操作类似,所以,我们可以通过位操作来实现加法。 假设给出的num1和num2,首先我们将num1^num2得到那些0 1位应该相加,没有进位。然后,我们用num1&&num2得到所有进位组成的数,因为这个进位组成的数应该是左移一位然后加入到之前得到的那个没有进位的数中。若,还有进位,证明位操作还有冲突,需要继续左移并加入到之前的结果中。直到所有的进位处理完毕为止。原创 2014-12-25 21:34:45 · 1089 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1356:孩子们的游戏(圆圈中最后剩下的数)--九度OJ
本题是一个约瑟夫环问题,具体可以参考百度百科“约瑟夫问题”的思想。在本题中同样为了处理的方便,我们假设编号从0开始到n-1。在n个人时,我们知道编号k-1人在第一次肯定出局,那么剩下0.....k-2 k k+1......n-1组成新的相对于n个人的编号:k k+1......n-1 0.......k。剩下的n-1个人(0.......n-2)组成一个新的问题,问题规模变小,但其他都没变。那么我们可以假设n-1个人中间编号为ans的人为最后的胜利者,那么这个人对应于有n个原创 2014-12-25 20:40:41 · 991 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1355:扑克牌顺子--九度OJ
本题应该还是思路比较清晰的一道题目了,我们首先统计一下大小王的个数,然后对给出的数进行排序,排序后我们统计出数字的空缺数字个数,比如若排序后是1 3,则空缺数字2,空缺的数字个数为1。最后我们比较大小王的个数与空缺数字的个数,若大小王个数少则无法补充空缺,牌不是顺子。否则是顺子。原创 2014-12-25 20:11:48 · 1257 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1509:树中两个结点的最低公共祖先--九度OJ
首先是树的输入,这个利用中序遍历的特点递归输入就行。然后,我们需要判断给出的两个节点是否都在树中,不在直接输出非法信息。若都在树中则继续查找,这个时候我们需要递归查找,给定一个头节点和两个待查的节点值,首先判断如果节点值等于头结点的节点值,那么公共节点肯定就是头节点;否则,继续在头结点的左支和右支中间查找,若两个节点值分居左右支树中,那么公共节点肯定也就是头结点。否则我们可以通过左支或者右支返回的节点得到公共节点。原创 2014-12-25 22:27:38 · 1226 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1360:乐透之猜数游戏--九度OJ
题的概率等于次数除以总的次数,所以,我们可以记录次数,这样更加简单。然后,我们发现每投掷一次得到的次数,都与前面几次有关系,所以我们可以总结该问题为dp问题。 我们可以设aa[i][j]代码投掷i次,得到总和为j的次数。那么aa[i][j]=aa[i-1][j-k],其中k为单个骰子的出现的点数。建立dp连接式我们可以很快得到结果。当然最后我们需要先算出四舍五入的概率后再排序。原创 2014-12-24 22:25:20 · 1340 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ
这道题目应该还比较简单,注意对旋转的数字的取模处理,然后就是利用两个string来分别存下旋转的前后部分,组后综合输出即可。原创 2014-12-24 22:13:16 · 748 阅读 · 0 评论 -
【剑指Offer面试编程题】 题目1350:二叉树的深度--九度OJ
本题应该是传统题,直接用dfs就能解决。难点在于树的构建和根结点的寻找。原创 2014-12-24 21:35:45 · 854 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1352:和为S的两个数字--九度OJ
本题是求和,我们首先可以考虑第一个元素该与哪个元素搭配,当然应该是最大的最后一个元素。对于这两个元素的和若与给定元素比较相等,当然是最好,直接输出。若比较后结果偏大,怎么调?当然只能是后面的那个元素前移;相对应的若偏小,则当然是前面的元素后移。最后我们能得到一个通过调整后相等的结果,若所有元素组合后没有满足条件,我们则认为数组没有和满足的组合。 那么这种思路为什么一定能找到呢?我们可以想象和为s的组合是其中的某一组,我们一定可以通过这种两端压缩的方式进行,原因是这种压缩的调整策略是一定的而且是合原创 2014-12-24 21:09:24 · 849 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1348:数组中的逆序对--九度OJ
本题还是有一定的难度的,首先我们不可能通过遍历的方案来完成,时间复杂度过高。然后我们可以想象,是否我们可以通过分块完成,完成字块的统计后,我们使字块有序,然后继续统计其他字块。最后我们合并统计字块。我们融入一种合并排序的思想,通过小块的统计并有序来构造更大的有序块,直到最后全部合并完成。对于两个有序小块之间包含的逆序对,我们只需要判断有限的组合即可完成统计。原创 2014-12-24 19:50:46 · 870 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1503:二叉搜索树与双向链表--九度OJ
解题的第一步当然是建树,给出先序遍历的二叉搜索树,自然就可以利用树的先序遍历的特点进行建树。先处理当前节点,再递归处理左支与右支。当遇到0则当前节点为空,退出递归。 第二步则是顺序的调整,顺序的调整当然利用二叉搜索树的中序遍历具有的排序功能,对该树进行中序遍历,且在遍历的时候动态的将节点的左右指针值更改掉。且需要维护一个前节点指针pr,将当期节点的pre指针指向pr,pr的next指针指向当期节点,完成双向链接,然后更新pr为当前节点,继续递归。若当前节点为空则退出递归。 当原创 2014-12-22 21:07:38 · 710 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ
本题虽然提示要用链表来处理,但只要思路一致,链表也没什么,只不过数据结构稍微复杂一点,但由于我的思路完全体现不出需要用链表的必要性,所以还是什么数据结构都不采用的简洁思想。 先指定第倒数k个元素为k=n-k,不存在则k=-1。然后顺次输入值,若输入到第n-k个元素则记录下该元素,不存在该元素则输出NULL。原创 2014-12-19 20:55:01 · 603 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1366:栈的压入、弹出序列--九度OJ
本题我们首先想到某个元素出栈意味着它之前的元素肯定都已经入过栈了,而我们发现入栈这一操作具有唯一性,也就是说一个元素只有一次入栈机会(就本题题意而言),那么我们很容易想到我们可以利用一个辅助的数据结构:队列。我们可以将栈的输入序列放入队列中,因为队列的出队具有顺序和唯一性,符合入栈的特点。对于出栈的每一个元素,首先判断栈的栈顶是否为该元素,若是该元素直接出栈即可;若栈顶元素不是该元素,则从队列中出队元素并压入栈,直到队列为空或者在队列中找到该元素为止。 对于出栈顺序中的每一个元素按上述规则处理,若发原创 2014-12-20 22:21:58 · 754 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1522:包含min函数的栈--九度OJ
本题一个最笨的想法就是每次取出所有的栈中的元素然后输出其最小值,然后再从新压入栈,当然这也仅仅是第一反应而已,题目肯定不能这么去解。从最小元素和栈的特点出发,我们每次取的只能是栈顶的元素,那么是不是存在每次取的元素就是我们需要的元素呢,也就是说每次取出的元素都是当前状态下的最小元素。仔细思考一下,我们发现我们可以压栈的时候做文章,我们可以在每次压栈的时候,都压入当前栈状态下的最小元素。 如何做到?若栈为空,但让栈的最小元素就是要压入的元素,直接压入,这个时候我们发现最小元素在栈顶。若栈非空,我们判断原创 2014-12-20 21:52:01 · 568 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1511:从尾到头打印链表--九度OJ
个人感觉这道题目没有什么意思,所以也就懒得用真正的链表去模拟,直接用一个递归输出最后的结果。原创 2014-12-18 20:41:01 · 742 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1388:跳台阶--九度OJ
题目从正面突破很难,我们可以换个角度思考,跳上第n个台阶有几种跳法?有两种跳法:从第n-1台阶跳和从第n-2台阶跳。从而,我们自然而然的得到第n个台阶的跳法等于第n-1台阶的跳法+第n-2台阶的跳法。这与斐波拉契数列是不是很像,这样我们很快就能想到万能的递归解法。递归的终止条件是当n==0和n==1时我们能很快知道有几种跳法。原创 2014-12-18 22:19:35 · 768 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1387:斐波那契数列--九度OJ
本题应该是非常经典的递推/递归问题了,而且递推式子题目也已经给出。由此,可以设置简单的递归函数,其终止条件是调用参数为0或者1的时候。 一点点小技巧:由于题目有多个测试案例,每个案例都需要寻找对应的斐波拉契数。所以在程序的开始可以将所有的斐波拉契数存于一个vector中,后面只需要查询即可。防止最后第70个斐波拉契数较大,采用long数据类型存储。原创 2014-12-18 21:47:09 · 858 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1510:替换空格--九度OJ
【解题思路】简单题目,逐个输入字符,知道遇到回车停止输入,如中途遇到空格,将空格替换成对应的字符串“%20”输出即可。原创 2014-12-04 12:27:35 · 936 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1513:二进制中1的个数--九度OJ
既然是二进制表示,我们只能从二进制入手,而二进制与位操作是紧密相关的,所以顺水推舟,很容易想多用位操作来实现。既然要统计1的个数,我们可以用一个只有一个1的二进制表示的数与目标数相与,从而就能得到该数1位置对应的目标数二进制位置是否为1,相与的结果为0则给位为0,否则为1。然后依次将数中1位置右移,并与目标数的二进制进行相与即可。原创 2014-12-18 23:12:56 · 698 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1390:矩形覆盖--九度OJ
本题应结合辅助图形来做题,边推导的同时边画图。本题首先需要处理的是,跳出n为偶数的陷阱。因为紧从偶数的角度思考,我们无法建立各数据之间的联系。当从所有的数考虑时,考虑第n个矩形,我们有两种摆放方式:第一种,竖着放,刚好占用第n个矩阵,这样前面n-1个矩形任意摆放,有第n-1个矩形种摆放方式;第二种,横着放,这样,第n-1个矩形也被占用了,所以只有第n-2个矩形种摆放方式。这不正是斐波拉契数列的类型么,而且当n==0 1 2时摆放很容易确定,这也是递推的基础。原创 2014-12-18 22:45:26 · 805 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1389:变态跳台阶--九度OJ
拿到本题的第一反应就是斐波拉契数列的变种,那么是否可以认为第n台阶的跳法等于前面所有的台阶的跳法相加呢,当然这种想法可以实现,但效率却很低。仔细研读题目,我们就会发现,我们可以去除很多重复的计算。从第1台阶到第n-2台阶的跳法的和其实就等于第n-1台阶的跳法,所以,第n台阶的跳法其实就等于第n-1台阶跳法的两倍。算法的其余部分就不在赘述了,递推式已经出来,而且终止条件也很好计算。原创 2014-12-18 22:36:27 · 662 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1386:旋转数组的最小数字--九度OJ
本题可以采用投机取巧的方法来完成,由于所有输入数据都必须要读入,题目的旋转数组的最小元素即可以看做从所有输入元素中寻找最小元素。这样的话,我们可以再输入元素的同时确定最小元素,如果当前输入元素比目标元素小,更新目标元素为当前输入值,继续输入。输入完成后,最小元素的值将保存在目标元素里面。 当然,本题的初衷不是这样的。本题的输入应该是第一个递增序列加上第二递增序列,而最小的元素即第二个递增序列的头元素。所以寻找到第二个递增序列的头元素即可解答该题。第二个递增序列的头元素也很好找,当发现当前输入的元素比之前的原创 2014-12-18 21:28:15 · 1103 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1512:用两个栈实现队列--九度OJ
新建栈st1模拟队列的输入,只要遇到push操作,都将元素压入st1中。另外,新建栈st2模拟队列的输出,如果pop操作时,先判断st1是否为空,当st2为空,则将st1的中的所有元素挨个弹出并压入st2中以备输出,这时的st2中的元素的排列正好是当前所有元素的输入的逆序,符合队列的输出顺序;-->>当出现pop操作时,如果st2不为空,这个时候的栈顶元素真好是当前状态的队列的头元素,则直接弹出栈顶元素作为队列的输出。原创 2014-12-18 21:11:44 · 611 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1523:从上往下打印二叉树--九度OJ
这道题目应该一眼就看看出是树的层序遍历,看出来之后也就没有什么可以说的了。注意首先用数据结构保存树,然后利用set数据结构寻找出根节点。然后就是利用队列进行层序遍历。原创 2014-12-20 22:33:43 · 743 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1516:调整数组顺序使奇数位于偶数前面--九度OJ
本题的思路还是比较简单的,对输入的每一个元素都进行判断,若是奇数则直接输出;如是偶数则存入vector中等后续处理。中间只需要对第一个元素的输出格式进行一下特殊处理即可。原创 2014-12-19 20:37:11 · 563 阅读 · 0 评论 -
【剑指Offer面试编程题】题目1520:树的子结构--九度OJ
一看到树,第一想法就是递归,虽然递归的效率确实不高,但在OJ上讲究时间效率,有时候配合适当的剪枝能快速AC。本题需要两层递归,首先我们要确定A树的哪个子树与B树进行比照,也就是确定A树的子节点,这是第一层递归;另外,在比较的时候我们也需要用到树的递归,对每一个节点进行比较。两层递归的顺序都是树的先序遍历的顺序。 中间有一点点小技巧,在第一层递归时,我们要在确定B树为子树的时候果断停止递归,避免过多的迭代。原创 2014-12-20 19:59:10 · 758 阅读 · 0 评论