程序员代码面试指南
文章平均质量分 74
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
求数组中最小的k个数以及海量数据最大堆、multiset解决方案
【题目】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【方案一】主要有两种方案。第一是利用我们熟知的 partition 算法,它是快速排序的核心,相信每个人都会。它可以用来求取数组的任意第 k 大的数,时间复杂度是O(n)。我们不断对数据 partition,当它返回的 index 为第 k-1原创 2017-01-02 20:29:32 · 2386 阅读 · 0 评论 -
腾讯笔试题--微信红包
本来这题没什么难度,不值得我写博客的,谁知道一个失误花了半小时才做出来。写下来告诫自己不要再犯错。 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。 给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。 若没有金额超过总数的一半,原创 2017-02-01 20:36:15 · 2899 阅读 · 2 评论 -
位运算之不使用任何比较判断比较两个数大小问题
【题目】对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。给定两个整数a和b,请返回较大的数。测试样例:1,2返回:2【分析】不用分析了,直接给代码,我第一次没有仔细读题,实际上用了判断的,解法1作为参考,解法2是正确答案。解法一(结果正确,但是不符合题意):class Compar原创 2016-12-19 18:00:24 · 8612 阅读 · 2 评论 -
判断一棵二叉树是不是另一棵的子结构问题
【问题】输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)【分析】这个问题其实不难,不过要注意代码上递归的技巧,并不是所有情况都是和我们用一个递归函数来解决的,这道题就用分类递归的思想,很让我受益。【代码如下】class Solution {public: bool HasSubtree(TreeNode*原创 2016-12-26 11:50:45 · 1791 阅读 · 0 评论 -
最大二叉搜索子树问题
【题目】有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。【分析】最大二叉搜索子树,我们只需要使用三个变量保存每个结点为根的子树的min,max,以及它对应的最大二叉搜索子树的结点数目。然后判断是否更新即可。注意两点:(左半原创 2016-12-19 13:39:08 · 1035 阅读 · 0 评论 -
二叉树最远距离问题
【题目】从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500.【分析】二叉树的最远距离有下列几种情况:根的左子树的最远距离+根节点+根的右子树最远距离根的左子树上的最原创 2016-12-19 11:04:33 · 1285 阅读 · 0 评论 -
折纸问题与二叉树
【题目】请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".测试样例:1原创 2016-12-19 10:50:38 · 1282 阅读 · 0 评论 -
判断一棵树是否是完全二叉树
【题目】有一棵二叉树,请设计一个算法判断它是否是完全二叉树。给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。【分析】完全二叉树树主要有两点:当一个结点有右孩子,但是没有左孩子,直接返回false当一个节点有左孩子无右孩子,那么接下来要遍历的节点必须是叶子结点。(叶子结点左右孩子为空)使用层次遍历并检查倒数第原创 2016-12-19 10:29:01 · 8482 阅读 · 4 评论 -
最短排序子数组
对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。测试样例:[1,4,6,5,9,10],6返回:2分析:求出需要排序的最短子数组的右界(设定初值为max,后面元素比max大,说明是正常情况,max继续向后原创 2016-12-09 13:34:06 · 481 阅读 · 0 评论 -
相邻两数最大差值
有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。测试样例:[1,2,5,4,6],5返回:2解析:使用bucket排序思想,把大小为n的数组分成(max-min)/n个区间,显然这个区间是1 ~ n。映射函数如下:((num - min) * n /原创 2016-12-09 19:56:33 · 2264 阅读 · 0 评论 -
构造数组的MaxTree
【题目】对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这原创 2016-12-12 12:19:55 · 904 阅读 · 0 评论 -
矩阵的最小路径和 [DP]
从本文开始,我打算多刷一些动态规划的题。不仅如此,各种典型算法也会在分类刷一刷。【题目】给定一个矩阵,从左上角开始每次只能向右或者右下走,最后到达右下角的位置,路径上所有数字累加起来就是路径和,返回所有路径中最小的路径和。【举例】如果给定的m如下:1,3,5,98,1,3,45,0,6,18,8,4,0路径1,3,1,0,6,1,0是所有路径中路径和最小原创 2016-12-08 15:55:03 · 1215 阅读 · 0 评论 -
链表的分化(Partition一分为二)
对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。测试样例:{1,4,2,5},3{1,2,4,5}方法一,快排Partition,但不满足两类节点原创 2016-12-12 21:43:38 · 1279 阅读 · 0 评论 -
环形链表插值题
有一个整数val,如何在节点值有序的环形链表中插入一个节点值为val的节点,并且保证这个环形单链表依然有序。给定链表的信息,及元素的值A及对应的nxt指向的元素编号同时给定val,请构造出这个环形链表,并插入该值。测试样例:[1,3,4,5,7],[1,2,3,4,0],2返回:{1,2,3,4,5,7}代码如下:/*struct ListNode {原创 2016-12-12 21:52:40 · 777 阅读 · 0 评论 -
单链表的k逆序
【题目】有一个单链表,请设计一个算法,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。例如链表1->2->3->4->5->6->7->8->null,K=3这个例子。调整后为,3->2->1->6->5->4->7->8->null。因为K==3,所以每三个节点之间逆序,但其中的7,8不调整,因为只有两个节点不够一组。给定一个单链表的头指针head,同时给定K值,原创 2016-12-13 21:27:30 · 1018 阅读 · 0 评论 -
判断一个单链表是否是回文链表
思路有三种:1.用栈顺着链表保存所有元素,然后依次出栈从头再比较。时间复杂度O(N),空间复杂读O(N)。2.还是栈,不过只保存前一半元素,然后和后一半对比即可。时间复杂度O(N),空间复杂度O(N/2)。3.利用链表逆序思想,将链表后半部分逆序。然后从前到中和从后到中一一对比即可。这种情况要注意将中间指针next指向要赋一次空,不然会导致死循环。同时我们得出结果后,不论真与假,都应该原创 2016-12-14 01:02:11 · 3227 阅读 · 0 评论 -
拼接最小字典序 --字符串数组
对于一个给定的字符串数组,请找到一种拼接顺序,使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的。给定一个字符串数组strs,同时给定它的大小,请返回拼接成的串。测试样例:["abc","de"],2"abcde"分析:该题实际上是对数组中的字符串排序,不过要注意特殊情况,比如“b”和“ba“,按字典序是”bba“这样的顺序,但实际上应该是”bab“整原创 2016-12-10 21:05:16 · 1914 阅读 · 0 评论 -
数组中出现次数超过一半的数字
【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。【分析】采用阵地攻守的思想:第一个数字作为第一个士兵,守阵地;count = 1;遇到相同元素,count++;遇到不相同元素,即为敌人,同归于尽原创 2017-01-02 14:04:16 · 450 阅读 · 0 评论