文章分类 - interview
question during interview
摘要:K个有序链表,用一个函数合并它们,并返回最终合并的结果:代码如下: ListNode *mergeKLists(vector<ListNode *> &lists) { // Start typing your C/C++ solution below // DO NOT write int main() function priority_queue<Node> q; ListNode L(1); ListNode* c = &L; L.next = NULL; for (int i = ...
阅读全文
摘要:二叉排序树,是非常特殊的一种树,具体定义见任何一本数据结构书籍。其删除一个节点需要考虑对应节点的状态,具体的说就是,是否存在左右节点,等等。需要按照以下情况讨论。1.查找待删除节点,在查找的同时需要记录一下待删除节点的父亲。2.如果待删除节点的左右节点都不存在,那么直接删除。3.如果待删除节点左子树存在右子树不存在,或者左子树不存在右子树存在。直接将其子树中存在的一边候补上来即可。4.如果待删除节点左右子树都在,这个情况是最复杂的。需要按照二叉排序树的性质从其左子树或者有子树中选择节点补到待删除节点的位置。 如果从左子树中选,就应该选择左子树中最右边的那个叶子节点(这里肯定是叶子,如果不是叶.
阅读全文
摘要:Given a binary tree, determine if it is height-balanced.For this problem, a height-balanced binary tree is defined as a binary tree in which thedepth of the two subtreesofeverynode never differ by more than 1.刚开始的时候老往AVL树上靠,后来才知道只需要两个子树的高度 never differ by more than 1,这个就好理解多了。代码如下: bool balance(T...
阅读全文
摘要:二叉树是数据结构的基础,递归的版本是十分简单而且简洁,但是非递归版本就相对比较复杂些。1.前序非递归便利二叉树: 前序比较简单,从根开始访问,并一直往左,同时将访问后节点的右子树入栈(如果存在的话),直到栈空。void preorder(TreeNode* root){ stack<TreeNode*> st; if (root == NULL) return ; st.push(root); while (!st.empty()) { TreeNode* p = st.top(); st.pop(); while (p...
阅读全文
摘要:Given an unsorted integer array, find the first missing positive integer.For example,Given[1,2,0]return3,and[3,4,-1,1]return2.此题关键在于理解first missing positive intege。题意为:一共n个数,有正数有负数,还有0.找到一个最小的正数不在这个集合中可以分析得到,整个最小的正数,最小是1,最大是 n + 1.解法1:用hash保存一下每个元素,然后从1开始查,check是否在hash里面,不在输出即可。简单明了,但是如果空间复杂度有限制?即 不
阅读全文
摘要:RT:Write a program to solve a Sudoku puzzle by filling the empty cells.Empty cells are indicated by the character'.'.You may assume that there will be only one unique solution.A sudoku puzzle......and its solution numbers marked in red.代码如下:不过有一个前提,有3×3的小方格内也必须满足不能出现相同数字的约定,所以回溯的时候加上了一个
阅读全文
摘要:RT,给定字符串s1,s2判断能否通过重排列 s1 s2从而产生s3.注意s1 s2中字符的相对顺序不能变。如: s1 = abc s2 = def s3 = abcdef return true s3 = adefbc return true s3 = aefdbc return false思路:1.递归,很简单的思路,代码如下: bool Can(string s1, string s2, string s3) { if (s3.size() != s1.size() + s2.size()) return false; ...
阅读全文
摘要:RT,在两个有序数组中找中位数或者第K大的元素.假设两个数组为A, B长度分别为m,n.分别是递增顺序。可以采用的算法有很多:首先想到的是类似MergeSort的方式,合并的同时找第K大元素,这个基本没难度,复杂度O(m + n)。不过此算法并不是最优,还有Log级别复杂度的算法,此算法其实很简单,远没有很多网站的代码那么玄乎,以下一一道来:首先明白几个前提:1.如果是求中位数,(m + n)是奇数还是偶数对结果是很有影响的,具体的如果(m + n)是奇数,中位数唯一,如果是偶数就有两个中位数,怎么取舍就看要求了。2.如果找到的第k大数(中位数类似)是 X ,如果X排在A中的 第Ax位置,X排
阅读全文
摘要:如题:题有很多变种:1.第一种 将一个有序数组循环移位K位后,最少要几个数就可以判断原数组的增减性解答:将三个数假定为是abc,如果大小关系为[bac,acb,cba]可以知道原数组是递增的.反之为递减2.在一个已知循环移位的有序数组上查找原数组的开始位置【根据1中方法判断递增或者递减】解答:【假如是递增】采用二分搜索的方法,每次搜索的时候将当前的值和[low]低端的值进行比较判断处于哪一边 如果...
阅读全文
摘要:一个整数序列(n为多少不知道),要你从中随机取出k个数,每个数被选中的概率一样:答案是前K个数放入k大小的数组,当前如果是K+1个数用(k/k+1)概率选中 并和前K个数组中的元素随机替换。同理当选择K+2。。。。n的情况证明如下:数学归纳法当n=K+1时: 第K+1个数选中的概率是(K/K+1) 第一个数选中的概率为 (1/K+1) + (K/K+1)*(1 - K/K+1) = (K/K+...
阅读全文
摘要:对一个有限态状态机来说:对应有一个开始状态和一个结束状态:如:状态机共有三个状态 A B C 。END为结束状态。其中A为初始状态, 状态之间存在状态转移的概率。如P(A->B) = a 等。。如果在状态机上随机游走的话,就会有一个状态序列,如 AABCBA等...问,状态序列为n时候的概率是多少?此题做的方法有两种:1。直接用递归枚举所有的长度为n状态序列,并把所有可能的序列加起来。2。d...
阅读全文
摘要:统计数字问题,见李晓东《计算机算法设计与分析》1-1。题意为。给定一个数N求从1到N的这N个数中0,1,2,3,4,5,6,7,8,9这10个数字出现的次数:同时所有的数字没有前导的0。 如6要写成6而不是 006 ,06这种形式。 举例子: 数字 1011 代表1出现3次 0出现1次。。《编程之美》上也有求1的个数。不过1比较特殊。李的题是求所有的数字出现的次数分析如下:这个分析同《编程之美》但...
阅读全文
摘要:这个题的解法:可以先通过排序得到第K个数即是第K大数。第二种解法就是利用快速排序的partition,这是一种随机算法,最坏情况下是n平方的,但是 平均情况下是 线性的。代码如下:[代码]3。 第三种方法可以采用算法导论上的SELECT算法。4。当然 还可以通过插入排序。或者堆都可以弄出来..
阅读全文
摘要:如题目所示:首先可以选的就是枚举从1到N 然后判断是否是素数,复杂度是 N的.还有一种方法是 厄拉多塞篩法 描述 如下:从 1到N 如果找到一个数 a是素数,那么将2*a 3*a .....M*a (M*a<N)全不剔除。一直到没有剔除为止:这样剩下的数就都是素数了。一個大於1的整數,如果除了它本身和1以外,不能被其他正整數所整除,這個整數就叫質數質數也叫素數,如2、3、5、7、11、13&...
阅读全文
摘要:给定通配符*表达的意思是匹配0个或多个任意字符。如abc* 匹配的字符串为以abc开头的任意字符串..实现函数bool match(char* p,char*s)其中p为模式串(含*)s为匹配串,按照题意判断二者是否匹配,如果匹配返回true,不匹配返回false思路:1。 递归,枚举*代表的字符数目,从0到n,然后用递归解决:[代码]递归解的实现比较直观,但是复杂度比较大估计到了n平方到n立方之...
阅读全文
摘要:记得以前学C的时候老喜欢考 ++ 操作符,公司笔试面试题也出现过在此提供一些题:我个人的理解放在最后} //运行结果是18,理解:1. ++在前的意思是“先加后用”,这里蕴含的意思是说,只要遇到++在前那么马上将内存中的变量加一,++在后的意思是”先用后加“这个“后加”的意思是语句结束(分号为语句结束)后才加,没结束 是内存中...
阅读全文
摘要:中序遍历:遇到一个节点后将返回值置为1, 如果左右子树返回值都是1那么这就是一个公共祖先,最近就是第一个,做一个标志位判断一下就可以了代码如下:[代码]最近想算法想得头晕 ,是不是不太适合搞代码?哎码工的无奈啊
阅读全文
摘要:此算法是动态规划中的经典:LCS即求数组 a b 中最长的公共子序列,其中序列不一定要相邻 。用动态规划解有两种,一种是正着解,一种是倒着解,即备忘录法贴下我写的代码:[代码]
阅读全文
摘要:最长递增之序列简称:LIS是一道很经典的算法题,问题定义如下给定一个无序的数组,找出长度最长的单调递增的子序列(不一定要相邻)解法可以采用动态规划,有两种方法:1.将源数组a 排序得到另一个数组b,然后在这两个数组中求LCS即(最长公共子序列)复杂度为 nlogn + n22.将源数组a直接采用动态规划,递推式很简单,如果第k位加入数组中,那么以k结尾的子序列的长度可以由(0。k-1)递推出来,即...
阅读全文
摘要:大学的时候记得最难得就是这个弗洛伊德了,记得考研的时候看到这个三重循环,我直接放弃,然后对自己说“这种变态算法基本不考”上研了也见了世面了。知道DP,在这里汗本科时候的算法课...最近由于找工作 于是就复习了下算法,参考了《算法导论》发现弗洛伊德是DP的一种应用 其实比较简单弗洛伊德算法是求解图的多源最短路径的。具有重叠子问题结构为:Floyd-Warshall算法(Flo...
阅读全文

浙公网安备 33010602011771号