
面试笔试算法题集
文章平均质量分 58
LaoJiu_
这个作者很懒,什么都没留下…
展开
-
直方图最大面积 ---- DP
Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.Above is a histogram where width of each原创 2016-03-09 23:09:41 · 1299 阅读 · 0 评论 -
中缀表达式转为后缀表达式 ---- 栈
题目:给一个中缀表达式(即标准形式的表达式),打印该表达式的后缀表达式。中缀表达式最大的不同就是去掉了表示运算符优先级的括号。操作数为26个小写或大写的英文字母(注意不包括数字和其他字符),操作符为+,-,*,/,(,),^,=,一共八个。具体见例子见下图 :代码如下:#include <iostream>#include <string>#include <stack>using namesp原创 2016-03-12 13:56:23 · 1279 阅读 · 0 评论 -
找出二叉树中某个节点的所有祖先节点
对于一颗普通的二叉树和一个节点key,找出该节点的所有祖先节点。例如树结构如下:给定的key为节点7,则应该打印 4,2,1。 1 / \ 2 3 / \ 4 5 /7使用递归可以很容易的解决,代码如下:#includeusing namespace std;struct N原创 2016-03-07 17:23:15 · 11601 阅读 · 2 评论 -
有序链表转化为平衡的二分查找树
给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。题目链接:https://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分。所有我们需要先找到中间节点,对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度原创 2016-03-07 17:13:09 · 1013 阅读 · 0 评论 -
判断是否是二叉查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \6 10/ \ / \5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列原创 2016-03-07 16:22:46 · 3311 阅读 · 1 评论 -
二分查找树转化为排序的循环双链表
一:题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。例如对于下面的二分查找树:small pointer 其实也就是指向左孩子,large pointer指向右孩子,转化为双链表之后 small pointer应该指向前一个元素,large pointer应该指向后一个元素。转化为排序的循环双链表则为:原创 2016-03-07 16:16:34 · 1530 阅读 · 0 评论 -
不使用递归和栈遍历二叉树
二叉树遍历一共三种方式(暂且不把层次遍历算在内),前序,中序和后序,而每种遍历又分为递归和非递归版本。不管是递归还是非递归,都用到了栈。为什么要用栈?那是因为其他的方式没法记录当前节点的parent,而如果在每个节点的结构里面加个parent 分量显然是不现实的,那么今天的题目主旨是不使用栈,这该如何实现?该方法是Morris提出的。他用得很巧妙,实际上是用叶子节点的空指针来记录当前节点的位置,然原创 2016-03-07 16:09:36 · 2925 阅读 · 1 评论 -
判断是否是完全二叉树
首先先在纸上画几个完全二叉树: 2 / \ 2 2 / \ / \ 2 2 2 2 2 / \原创 2016-07-16 21:57:29 · 737 阅读 · 0 评论 -
求最长上升/下降子序列【O(nlgn)】
以最长上升子序列为例,例如给定数组:1,5,8,3,6,7,则最长上升子序列个数是4,也就是1,5,6,7或者是1,3,6,7。对于这样的问题,我们很容易想到n*n复杂度的DP,但是这里再介绍另一种方法,时间复杂度可以降为n*lgn。这个算法的具体操作如下:开一个栈,每次取栈顶元素top和读到的元素temp做比较,如果temp > top 则将temp入栈;如果temp 这原创 2016-08-02 19:14:25 · 1339 阅读 · 0 评论 -
全排列的实现方法--递归&字典序
一:背景全排列在很多笔试都有应用,是一个很常见的算法,关于这类的题目变化很多。这种算法的得到基于以下的分析思路。 给定一个具有n个元素的集合(n>=1),要求输出这个集合中元素的所有可能的排列。例如:给定{1,2,3},全排列为3!个,即:{1,2,3},{1,3,2}{2,1,3},{2,3,1}{3,1,2},{3,2,1}下来分别说下递归法,John原创 2016-04-11 15:33:25 · 17686 阅读 · 2 评论 -
对5个数进行排序,需7次比较的方法
本文介绍一个对5个数进行排序的方法,仅使用7次比较。假设要排序的数为a,b,c,d,e。 首先将a,b进行比较,假设结果为a比较,假设结果为c比较(即比较b,d),假设结果为b三次比较。,这个图的含义为:a 现在将e插入到{a,b,d}的适当位置,采用二分查找法寻找查找位置时,只需要两次比较——先同b比较,然后再同a或d比较。将e插入到{a,转载 2017-02-15 23:09:22 · 3125 阅读 · 0 评论 -
最小值和最大值
在一个包含n个元素的集合中同时找出最小值和最大值,求解最佳思路。思路: 常规思路就是,遍历每个元素,分别与min和max比较,这共需2n−22n-2次比较。 事实上我们可以每次遍历两个元素,把这两个元素进行比较,小的再与min比较,大的与max比较,这样算来一共需要3n2\frac {3n}2次比较,也就是每两个元素需要3次比较。原创 2017-03-14 08:57:31 · 814 阅读 · 0 评论 -
求第k小的数
题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序然后取第K个,但是当数组非常大的时候,效率不高,那有没有简单的方法了,其实我们早就学过,只是我们不善于思考和变通。很多人刚开始非常热衷于各种排序算法只是了解却没深究,这个题目的复杂度是O(n),原理就是快速排序里面的划分算法。分析:快速排序选择一个base(一般是第一个数)对数组进原创 2016-04-18 16:08:52 · 1276 阅读 · 0 评论 -
二叉树求两节点最低公共祖先,求任意两节点距离
-------1.求最低公共祖先LCA( Lowest Common Ancestor ) 什么是最低公共祖先?如下图,2与3的LCA是1;1与4的LCA是1;4与5的LCA是2。 那么给定两个节点n1和n2,现在要找出它们的LCA,如何找?首先分析一下,n1和n2有几种情况?第一种,n1和n2分别在一个节点的左右子树中,比如4和5,LCA原创 2016-01-09 13:34:45 · 7607 阅读 · 0 评论 -
寻找下一个较大元素 --- 利用栈
这是一道亚马逊的面试题。给定一个数组,打印出每一个元素的下一个更大的元素( Next Greater Element,NGE ),就叫做NGE问题吧。一个元素x的下一个更大的元素是指在x的右边第一个比该元素大的元素。如果没有更大的元素,则输出-1。例如:a) 任何数组,最右边的元素的NGE为-1。b) 对于一个降序排序的数组,所有元素得到NGE为-1c) 对原创 2016-03-08 23:04:43 · 1785 阅读 · 0 评论 -
包含min函数的栈 ---- 利用栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小原创 2016-03-08 23:00:31 · 814 阅读 · 0 评论 -
判断两个数是否符号相反----位运算
问题:写一个函数,判断给定的两个数字是否是符号相反的,不可以使用比较运算符。例如 fun(-1, 100) == true; fun(5,6)=false; fun(-1,-2)=false; 同时,规定0属于正数。在二进制表示中,最高位是1的话,就是负数。最高位为0则为正数。因此我可以想办法通过位运算来判断。1 ^0 = 1。所以 负数^正数=负数。其实就是类似于乘法了。#i原创 2016-05-05 18:06:53 · 9659 阅读 · 2 评论 -
检测一个数能否被3整除----位运算
第一个解决方案就是小学就学过的,如果一个数的每个位相加之和能被3整除,则这个数就可以被3整除。例如612各位之和为9,则可以被3整除。但是这个解决方法并不高效,我们需要取得每一位,然后再一个个相加。观察二进制,我们可以找到一个模式来判断一个数能否被3整除。如果所有的偶数位出现1的次数为 even_count, 奇数位出现1的次数为 odd_count,两者只差如果是3的倍数,那么这个数就是3倍原创 2016-05-05 18:56:53 · 4804 阅读 · 0 评论 -
二进制中1的个数----位运算
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。样例输入:45-1样例输出:1232#include#includeusing namespace std;int main(){ unsigned int x; while (1) { cin >> x; int num = 0; while (x)原创 2016-05-05 20:38:25 · 617 阅读 · 0 评论 -
寻找缺失的数字
问题:给一个长度为n-1的数组,数字的范围在 1到n(无重复),其中有一个缺失的数字,找出该数字。要求时间复杂度为O(n),空间复杂度为O(1).方法1 使用公式1 + 2 + … + n 的公式为 n*(n+1)/2,知道了总和,再前去数组的总和,即为缺失的数字。int getMissingNo (int a[], int n){ int i, total;原创 2016-05-07 13:02:28 · 2030 阅读 · 0 评论 -
数字转字母的编码方式的个数 ---- DP
假设1到26之间的26个数据,可以编码为对应的’A'-’B',对于一个给定的数字字符串,可以有多少种编码方式?假定输入都是合法的(不会有”30″)。举例:输入: digits[] = "121"输出: 3// "ABA", "AU", "LA"输入: digits[] = "1234"输出: 3// "ABCD", "LCD", "AWD"动态规划:原创 2016-03-14 16:25:24 · 3185 阅读 · 1 评论 -
Tromino谜题 ---- 分治法(C++版&OpenCV版)
一:问题描述原创 2016-05-24 13:31:38 · 3024 阅读 · 0 评论 -
面试笔试算法目录
位运算寻找缺失的数字 二进制中1的个数—-位运算 检测一个数能否被3整除—-位运算 判断两个数是否符号相反—-位运算动态规划 数字转字母的编码方式的个数 —- DP 直方图最大面积 —- DP利用栈寻找下一个较大元素 — 利用栈 包含min函数的栈 —- 利用栈原创 2016-05-25 23:27:32 · 1324 阅读 · 0 评论