俊介三

一天更新一点,一天积累一点

导航

随笔分类 -  Interview

摘要:题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。采用堆排比较好,但最后一个数据超时了?update(2013.4.16):用我面B公司时被问到的一个方法就能过,晕~~思路:类似快排的方法,每次递归地找k个数落入哪个部分。最后在sort一个这k个数就好,代码:#include <cstdio>#include <iostream>#include <algorithm>using namespace std; void partition(int*arr, int k, int 阅读全文

posted @ 2013-04-08 13:33 俊介三在前进 阅读(202) 评论(0) 推荐(0)

摘要:题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。http://ac.jobdu.com/problem.php?cid=1039&pid=9思路:这个问题思路很简单,但思路简单不意味着轻易能全对。对我做递归题有更深的了解吧,所以贴进来了。递归题的一般想法:1)看清结构,想办法分出递归子问题来;2)考虑递归到最后会出现哪些情况,如本题,要么左树为空、要么右树为空、要么都不为空、要么只剩一个元素等等情况,把这些情况if else一下,即分段讨论;3)用笔画出图来,找出每种情况题中i和j的关系 阅读全文

posted @ 2013-04-04 11:10 俊介三在前进 阅读(132) 评论(0) 推荐(0)

摘要:题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10思路:直接模拟它进行顺时针的行走,若遇到矩阵范围外,或已走过的区域,则转向;若不能转向了,则结束。但奇怪的是超时?最后一个case还没跑1秒就过去了~http://ac.jobdu.com/problem.php?cid=1039&pid=7代码:#include <stdio.h>#include < 阅读全文

posted @ 2013-04-03 22:09 俊介三在前进 阅读(149) 评论(0) 推荐(0)

摘要:题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:一般思维从左上往右下一直找会遇到困难,因为向右和向下都是比自己大的,该往哪个方向走呢??最好的方法是从右上角开始走,找到就退出,比它大就向下走,比它小就往左走。。或者,从左下角开始走也行,总之保证它能走的方向只有一个。代码:#include <iostream>#include <stdio.h>using namespace std;bool helper(int* A, int m, i 阅读全文

posted @ 2013-04-03 13:30 俊介三在前进 阅读(191) 评论(0) 推荐(0)

摘要:题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是 O(n) ,空间复杂度是 O(1) 。思路:这是个比较新颖的题,经典的题是“给一个数组里面只有一个数字出现一次,其余的数都出现两次,把这个唯一的数找出来”,利用OXR操作的特性很容易把它找出来。即,抑或操作,相同为0,不同为1(0 ^ x) == x(x ^ x) == 0本题思路:抑或所有数,得到的是要找的数num1 num2的抑或值。由于这两个数是不相等的,那么这个抑或值一定不为0,就找到为1的位是那个,把原数组根据这个位分成两组。每组抑或得到的值即为所求的两个不同的数。代码 阅读全文

posted @ 2013-04-01 15:05 俊介三在前进 阅读(214) 评论(0) 推荐(0)

摘要:一个数组是由一个递减数列左移若干位形成的,比如 {4 , 3 , 2 , 1 , 6 , 5}是由 {6 , 5 , 4 , 3 , 2 , 1} 左移两位形成的,在这种数组中查找某一个数。思路:二分查找,用if语句来进行“加强条件限制”(相当于中学时候分段讨论的思想),把具有单调性的一半讨论出来,如果不在此单调性段内,则在复杂的else中找去。知道找到或最后找不到为止。代码:#include <stdio.h>int helper(int* arr, int key, int start, int end);//return the index of the element if 阅读全文

posted @ 2013-04-01 13:46 俊介三在前进 阅读(830) 评论(0) 推荐(0)

摘要:队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列贴个win下的代码,貌似java的多线程更方便点。(后来看《Java并发实践》及《Core Java 1》最后一章再来~)#include <windows.h> #include <stdio.h> #include <stdlib.h> typedef HANDLE Semaphore; //信号量的Windows原型 #define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作 #defi... 阅读全文

posted @ 2013-03-30 14:16 俊介三在前进 阅读(353) 评论(0) 推荐(0)

摘要:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.#include <stdio.h>#include <list>using namespace std;void find(int n, int m){ static list<int> mylist; if(n<0 || m<0) return; if(m>0){ mylist.push_front(n); find(n-1,m-n); mylist.pop_front(); find(n-... 阅读全文

posted @ 2013-03-28 16:45 俊介三在前进 阅读(156) 评论(0) 推荐(0)

摘要:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / \ 6 10/\ /\5 7 9 11输出: 8 / \ 10 6 /\ /\11 9 7 5非递归版本采用栈来实现:#include <stdio.h>#include <stack>using namespace std;struct Node{ int data; Node* left; Node* right; Node(){} Node(int d){ data = d; ... 阅读全文

posted @ 2013-03-28 14:20 俊介三在前进 阅读(144) 评论(0) 推荐(0)

摘要:题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。思路:后序遍历意味着数组最后一个元素一定是根。再根据binary search tree的特点,左子树一定比根小,右子树一定比根大来递归地检查左右子树。代码:#include <stdio.h>bool ispostorder(int* ar 阅读全文

posted @ 2013-03-28 13:06 俊介三在前进 阅读(158) 评论(0) 推荐(0)

摘要:用一种算法来颠倒一个链接表的顺序。递归和不递归的方法:#include <stdio.h>#include <stdlib.h>struct List{ int data; List* next; List(){} List(int d){ data = d; next = NULL; } List(int d, List* list){ data =d; next = list; }};//append an element to tailList* appendToTail(int data,... 阅读全文

posted @ 2013-03-28 12:03 俊介三在前进 阅读(278) 评论(0) 推荐(0)

摘要:给出两个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交.(注意要考虑此链是否带环)#include <stdio.h>#include <stdlib.h>struct List{ int data; List* next; List(){} List(int d){ data = d; next = NULL; } List(int d, List* list){ data =d; next = list; }};//append an element to tailList* app... 阅读全文

posted @ 2013-03-28 09:52 俊介三在前进 阅读(133) 评论(0) 推荐(0)

摘要:题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。(当然:涉及真正工程项目不会这样”就事论事“,还要看为什么要找其中最小K个?这K个需不需要排序了?以后会不会变成找最大K个?等问题,要考虑到业务原因。直接给它用O(nlogn)排序好了!)思路:就遍历一遍这n个数,每次尝试放入容量为k的优先队列中。不知道这个复杂度怎么算?貌似维护一个长度为k的优先队列复杂度是O(klogk)吗?这样O(nklogk)比O(nlogn)优吗?!不知道 :(#include <stdio.h>#include <queue& 阅读全文

posted @ 2013-03-27 21:20 俊介三在前进 阅读(115) 评论(0) 推荐(0)

摘要:题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。这个问题最近做得烂透了。思路:把需要带到叶子的中间结果作为参数放在递归函数里,每次往里加~(我再看看别人又是如何写的。。)我的代码:#include <iostream>#include <stdlib.h>#include <stack>#include <queue>using namespace 阅读全文

posted @ 2013-03-27 20:53 俊介三在前进 阅读(126) 评论(0) 推荐(0)

摘要:题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。找到状态转移方程,dp[i]表示前i个数中,包含i的子数组的最大和。要么第i个数自己最大,要么他要和包含i-1的子数组最大和(即dp[i-1])联合在一起.即dp[i] = max{arr[i],dp[i-1]+arr[i]};代码如下;#include <stdio.h>#de 阅读全文

posted @ 2013-03-27 20:31 俊介三在前进 阅读(100) 评论(0) 推荐(0)

摘要:题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。思路:最初以为不就push进来,对比一下已有的,再标记当前最小的嘛。。后来发现,pop出去的时候,有可能min就不同了,恢复不了之前min的值,囧。应该再开辟一个栈(称为栈B),栈B和原栈(称为栈A)同步push,同步pop,且栈B的顶是栈A最小值的index,这样同步push和pop就能保证一直维护这这个min代码:#include <stdio.h>#include <iostream>#include <memory.h>s 阅读全文

posted @ 2013-03-27 20:15 俊介三在前进 阅读(167) 评论(0) 推荐(0)

摘要:题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。思路:可以看到双链表的排序是二叉树中序遍历的结果。因此,我们可以中序遍历二叉树,每次访问一个节点,就把它添加进我们的双链表来,注意,添加的意思是是改变一个指针而已,不需要额外的空间。。当然,需要记录一下双链表的头,以及每一次双链最后那个node。见代码:#include <stdio.h>#include <stdlib.h>#include <stack& 阅读全文

posted @ 2013-03-27 19:31 俊介三在前进 阅读(143) 评论(0) 推荐(0)

摘要:占位符 阅读全文

posted @ 2013-03-26 20:58 俊介三在前进 阅读(102) 评论(0) 推荐(0)

摘要:给一个字符串,求它的全排列。如输入“abc”输出“abc” "acb" "bac" "bca" "cab" "cba"思路1:例如“abc”的情况,假如再来个“d”,那么怎么办呢?就是把“d”插入到原来排列的所有狭缝中。思路2:对于每个,都有可能放在第一位,因此先放“a”在首位,后面跟着b和c的全排列。对于每个都如此操作即可。思路2性能比较好,因为不用把中间结果保存着,再插入某个字母,又返回一个中间结果~#include <stdio.h>#include <string.h& 阅读全文

posted @ 2013-03-26 20:57 俊介三在前进 阅读(168) 评论(0) 推荐(0)

摘要:#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define max(a,b) (a)>(b)?(a):(b)int arr[100][100];int find(int* arr, int len){ int i; int max = arr[0]; for(i=1;i<len;i++){ arr[i] = max(arr[i],arr[i-1]+arr[i]); if(max<arr[i]) max = arr[i]; } r 阅读全文

posted @ 2013-03-26 16:11 俊介三在前进 阅读(150) 评论(0) 推荐(0)