IT面试
赢在拼搏中
这个作者很懒,什么都没留下…
展开
-
最长递增子序列
问题描述: 对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui 给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。测试样例:[2,1,4,3,1,5,6],7返回:4AC代码:class AscentSequence {public: i原创 2016-05-10 12:58:49 · 253 阅读 · 0 评论 -
完全二叉树结点数
给定一棵完全二叉树的头节点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。原创 2016-05-06 14:01:44 · 470 阅读 · 0 评论 -
最长回文子串
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。原创 2016-05-06 20:12:10 · 426 阅读 · 0 评论 -
Manacher算法求字符串的最长回文子串
在求字符串的最长回文子串时,绝大部分的算法的时间复杂度都将达到o(n^2)甚至达到o(n^3),而Manacher算法却可以达到o(n)。 通过在每个字符的两边都插入一个特殊的符号,将所有的字符串都转化成为奇数长度。然后创建一个新的P[i]表示,以第i个字符为中心的回文字串的半径。对应的P如下,设S为原始字符串:通过观察上面的表,大家可以发现P[i]-1就是实际回文字串的长度原创 2016-05-06 20:21:11 · 252 阅读 · 0 评论 -
添加回文串
问题描述: 对于一个字符串,我们想通过添加字符的方式使得新的字符串整体变成回文串,但是只能在原串的结尾添加字符,请返回在结尾添加的最短字符串。给定原字符串A及它的长度n,请返回添加的字符串。保证原串不是回文串。测试样例:"ab",2返回:"a"AC代码:class Palindrome {public: string addToPalindr原创 2016-05-07 13:20:35 · 422 阅读 · 1 评论 -
串的模式匹配
对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。原创 2016-05-07 18:40:49 · 1270 阅读 · 0 评论 -
KMP匹配算法
转自KMP匹配算法的部分内容: 在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算法,当第一次搜索到S[5] 和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值(next[5]=2,为什么?后面讲),直接比较S[5] 和T[2]是否相等,因为相等,S和T的下标同时增加;因为又相等,S和T的下标转载 2016-05-07 19:57:08 · 374 阅读 · 0 评论 -
bfprt算法
转自bfprt算法中的部的那内容: 快速排序算法,将原始数据划分为两个部分,在分别对两部分数据按同样的方法分治递归,通过不断的递归将大的问题划分为2个小的字问题,达到快速的目的,算法的平均时间复杂度为O(n*logn), 这里的枢纽元的选择很关键,如果选择的是最大值或是最小值,那么划分的连个子问题将会严重不平衡,算法的最坏复杂度将会达到O(n*n)。关于枢纽元的选择,在算法导转载 2016-05-07 20:58:06 · 1885 阅读 · 0 评论 -
数组Mex
题目描述: 请设计一个高效算法,查找数组中未出现的最小正整数。给定一个整数数组A和数组的大小n,请返回数组中未出现的最小正整数。保证数组大小小于等于500。测试样例:[-1,2,3,4],4返回:1AC代码:class ArrayMex {public: /*void swap(int &t1, int &t2){ int原创 2016-05-09 14:19:14 · 945 阅读 · 0 评论 -
相邻最大差值
问题描述: 请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。测试样例:[9,3,1,10],4返回:6AC 代码:class MaxDivision {public: int findMaxDivision(vector A转载 2016-05-09 14:54:43 · 1499 阅读 · 0 评论 -
递归和动态规划-汉诺塔II
题目描述: 有一个int数组arr其中只含有1、2和3,分别代表所有圆盘目前的状态,1代表左柱,2代表中柱,3代表右柱,arr[i]的值代表第i+1个圆盘的位置。比如,arr=[3,3,2,1],代表第1个圆盘在右柱上、第2个圆盘在右柱上、第3个圆盘在中柱上、第4个圆盘在左柱上。如果arr代表的状态是最优移动轨迹过程中出现的状态,返回arr这种状态是最优移动轨迹中的第几个状态。如原创 2016-05-09 21:27:03 · 2164 阅读 · 0 评论 -
继承和组合、多态性和虚函数
继承和组合: 重用已存在类的代码有两种方式:1,组合,即在新类中创建已存在类的对象;2,继承,即创建一个新类作为一个已存在类的类型。 在派生类中可以重新定义基类中的成员函数,派生类的对象调用该函数时调用的是重新定义的成员函数,而调用基类的成员函数只能使用作用域显示的标明基类名。 构造函数和西沟函数的调用顺序:构造函数是从类层次的最根处开始原创 2016-05-08 09:32:31 · 632 阅读 · 0 评论 -
数组单调和
题目描述: 现定义数组单调和为所有元素i的f(i)值之和。这里的f(i)函数定义为元素i左边(不包括其自身)小于等于它的数字之和。请设计一个高效算法,计算数组的单调和。给定一个数组A同时给定数组的大小n,请返回数组的单调和。保证数组大小小于等于500,同时保证单调和不会超过int范围。测试样例:[1,3,5,2,4,6],6返回:27 思路:原创 2016-05-09 09:18:50 · 1475 阅读 · 0 评论 -
动态对象创建(new/delete & malloc/free)
malloc/free是c/c++的库函数,不在编译器的将控制范围之内,我们必须手动的调用构造函数和析构函数来对该内存进行初始化和释放。malloc只是分配了一块内存,而不是生成本了一个对象,所以它反悔了一个void*类型指针,而c++不允许讲一个void*类型指针赋予其他指针,所以必须强制类型转换。new/delete是c++提供的运算符,new:首先分配内存,然后调原创 2016-05-06 08:41:00 · 534 阅读 · 0 评论 -
击鼓传花
题目描述学校联欢晚会的时候,为了使每一个同学都能参与进来,主持人常常会带着同学们玩击鼓传花的游戏。游戏规则是这样的:n个同学坐着围成一个圆圈,指定一个同学手里拿着一束花,主持人在旁边背对着大家开始击鼓,鼓声开始之后拿着花的同学开始传花,每个同学都可以把花传给自己左右的两个同学中的一个(左右任意),当主持人停止击鼓时,传花停止,此时,正拿着花没传出去的那个同学就要给大家表演一个节目。聪明的小原创 2016-07-21 15:57:06 · 1335 阅读 · 0 评论 -
比大小
题目描述现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的?输入第一行有一个整数n(0<n<=10000);随后有n行,每行是一个排列;样例输入3abcdefghijklhgebkflacdjigfkedhjblcia输出输出一个整数m,占一行,m表示排列是第几位;样例输原创 2016-07-21 18:49:05 · 379 阅读 · 0 评论 -
word-break-ii
问题描述:Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word.Return all such possible sentences.For example, givens原创 2016-08-11 19:48:55 · 490 阅读 · 0 评论 -
函数重载
友元函数重载时,参数列表为1,说明是1元运算符,为2说明是2元运算符成员函数重载时,参数列表为空,是一元运算符,参数列表是1,为2元运算符原创 2016-08-11 20:08:40 · 212 阅读 · 0 评论 -
左右最值最大差
给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0..K],右部分A[K+1..N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?给定整数数组A和数组的大小n,请返回题目所求的答案。测试样例:[2,7,3,1,1],5返回:6原创 2016-05-06 13:58:40 · 327 阅读 · 0 评论 -
顺时针旋转矩阵
有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。测试样例:[[1,2,3],[4,5,6],[7,8,9]],3返回:[[7,4,1],[8,5,2],[9,6,3]]原创 2016-05-06 13:47:28 · 354 阅读 · 0 评论 -
最长公共子序列
问题描述: 我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度原创 2016-05-10 17:16:56 · 452 阅读 · 0 评论 -
最小编辑代价
题目描述: 对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。测试样例:"abc",3,"adc",3,5原创 2016-05-10 21:38:50 · 515 阅读 · 0 评论 -
字符串交错组成
问题描述: 对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变。请编写一个高效算法,判断C串是否由A和B交错组成。给定三个字符串A,B和C,及他们的长度。请返回一个bool值,代表C是否由A和B交错组成。保证三个串的长度均小于等于100。测试样例:"ABC",3,"12C",3,"A12BCC",6返回:tr原创 2016-05-11 10:04:20 · 5163 阅读 · 0 评论 -
All Roads Lead to Rome (30)
问题描述: Indeed there are many different tourist routes from our city to Rome. You are supposed to find your clients the route with the least cost while gaining the most happiness.输入描述:Eac原创 2016-05-24 12:55:17 · 566 阅读 · 0 评论 -
表达式组成方案
问题描述: 对于一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成的逻辑表达式,再给定一个结果值。现在可以对这个没有括号的表达式任意加合法的括号,返回得到能有多少种加括号的方式,可以达到这个结果。给定一个字符串表达式exp及它的长度len,同时给定结果值ret,请返回方案数。保证表达式长度小于等于300。为了防止溢出,请返回答案Mod 10007的值。原创 2016-05-11 13:09:42 · 937 阅读 · 0 评论 -
纸牌博弈
题目描述: 有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家a和玩家b都绝顶聪明,他们总会采用最优策略。请返回最后获胜者的分数。给定纸牌序列A及序列的大小n,请返回最后分数较高者得分数(相同则返回任意一个分数)。保证A中的元素均小于等于1000。且A的大小小于等于300。原创 2016-05-11 19:10:53 · 825 阅读 · 0 评论 -
构造MaxTree
问题描述: 对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请证明这个方法的正确原创 2016-05-11 21:24:15 · 444 阅读 · 0 评论 -
链表的回文结构
问题描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:1->2->2->1返回:true 思路:如果没有额外空间复杂度O(1)的限制: 1,我们原创 2016-05-12 09:55:55 · 405 阅读 · 0 评论 -
最短排序
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。给定一个整数数组A及它的大小n,请返回最短子数组的长度。测试样例:[1,5,3,4,2,6,7],7返回:4原创 2016-05-06 13:57:27 · 341 阅读 · 0 评论 -
scramble-string
题目描述:Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.Below is one possible representation of s1 ="great": great / \ gr原创 2016-05-16 09:43:31 · 345 阅读 · 0 评论 -
科学计数法转换为普通数字
题目描述: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出。现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留。输入描述:每个输入包含原创 2016-05-17 11:31:06 · 42802 阅读 · 1 评论 -
多数组第K小数
给定两个有序数组arr1和arr2,在给定一个整数k,返回两个数组的所有数中第K小的数。例如:arr1 = {1,2,3,4,5};arr2 = {3,4,5};K = 1;因为1为所有数中最小的,所以返回1;arr1 = {1,2,3};arr2 = {3,4,5,6};K = 4;因为3为所有数中第4小的数,所以返回3;要求:如果arr1的长度为N,arr2的长度为M,时间复杂度请达到O(log(min{M,N}))。原创 2016-05-06 13:09:24 · 357 阅读 · 0 评论 -
数组中局部最小数的位置
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。原创 2016-05-06 13:33:37 · 370 阅读 · 0 评论 -
多数组上中位数
给定两个有序数组arr1和arr2,两个数组长度都为N,求两个数组中所有数的上中位数。例如:arr1 = {1,2,3,4};arr2 = {3,4,5,6};一共8个数则上中位数是第4个数,所以返回3。arr1 = {0,1,2};arr2 = {3,4,5};一共6个数则上中位数是第3个数,所以返回2。要求:时间复杂度O(logN)原创 2016-05-06 13:37:08 · 378 阅读 · 0 评论 -
折纸问题
请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的方向指向纸条的背面的这条折痕叫做“下”折痕 ;突起的方向指向纸条正面的折痕叫做“上”折痕。如果每次都从下向上对折,对折N次。请从上到下计算出所有折痕的方向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".原创 2016-05-06 13:39:08 · 438 阅读 · 0 评论 -
顺时针打印矩阵
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。测试样例:[[1,2],[3,4]],2,2返回:[1,2,4,3]原创 2016-05-06 13:45:48 · 244 阅读 · 0 评论 -
换零钱
问题描述:考虑仅用1分、5分、10分、25分和50分这5种硬币支付某一个给定的金额。例如需要支付11分钱,有一个1分和一个10分、一个1分和两个5分、六个1分和一个5分、十一个1分这4种方式。请写一个程序,计算一个给定的金额有几种支付方式。注:假定支付0元有1种方式。输入描述:输入包含多组数据。每组数据包含一个正整数n(1≤n≤10000),即需要支付的金额。原创 2016-08-11 21:37:20 · 511 阅读 · 0 评论