算法
文章平均质量分 72
yingsun
坚持下去~
展开
-
Bottom View of a Binary Tree
Given a Binary Tree, we need to print the bottom view from left to right. A node x is there in output if x is the bottommost node at its horizontal distance. Horizontal distance of left child of a nod原创 2014-12-17 15:15:23 · 2568 阅读 · 1 评论 -
find intersection of two sorted arrays
Let 's called array1 as A and array2 as B, each with size m and n.The obvious brute-force solution is to scan through each element in A, and for each element in A, scan if that element exist in B.原创 2013-01-17 11:44:46 · 1356 阅读 · 0 评论 -
找出一个字符串中的最长palindrome子串
例如:字符串“babcbabcbaccba”中的最长回文字串是abcbabcba,回文就是从字符串的开头遍历和从结尾遍历得到的结果都是一样的。那么我们怎么来解决这个问题呢?很容易想到的就是应用brute-force方法,即对每一个给定字符串的子串都做一次判断_is_palindrome:bool _is_palindrome(string s) { int n = s.length(原创 2013-01-18 17:20:09 · 3363 阅读 · 0 评论 -
give two sorted array, find the k-th smallest element of union of A and B
Give you two sorted array, find the k-th smallest elements of union of A and B, you can assume that there are no duplicate elements. the size of A is m, and size of B is n, both them are in acsending原创 2013-01-17 16:08:35 · 1901 阅读 · 0 评论 -
Given an array say [9,20,-2,-45,23,5,1], find the minimum positive missing number from the array.
解决这个问题有两种思路:第一种就是应用hash表来记录,不考虑所有的负数,首先我们找到数组中最大的正数,比如说这个数组中的23,然后分配23个空间,所有值都标记为0,然后遍历数组,如果对应的正数出现,就标记为1,这样,遍历整个数组之后就把所有出现的正数都记录了下来。然后重新遍历hash表,遇到一个值为0的就是我们要找的那个正数。这种方法的时间复杂是O(n),但是空间复杂度要随着数组中的最大数的改变原创 2013-01-15 10:57:34 · 1083 阅读 · 0 评论 -
给定一个链表,怎么判断链表中存储的数据是回文
check whether a single linked list is palindrome. for example: 1->2->1,return ture. and 1->2->3->1 return false; and can you resolve it in linear time. 如果是数组那用递归和非递归都很好解决了,但是链表貌似有点麻烦。首先给出思路就是:先找到链表中原创 2013-01-16 17:23:55 · 3747 阅读 · 0 评论 -
难了我两个月的海豚浏览器面试题,终于解决了。
这个题纠结了两个多月,一直没有找到很好的解决方法,现在终于能够找到一种很满意的方法了。题目:有两个大小都是k的数组A,B,它们元素的按非递减有序排列,找出这样的k个最小的(ai + bj) ,其中 0想到的最简单的方法就是开辟一个k*k的二维数组,然后计算所有的(ai + bj), 然后在其中找到最小的k个(ai + bj),但是这样的时间复杂度和空间复杂度都很高O(k^2)。那么接下原创 2013-01-29 13:26:40 · 4125 阅读 · 1 评论 -
给定一个整数,打印出它的所有素数因子--两种方法,两种效率。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。(2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。先给出代码,然后我在解释这个原创 2012-10-16 13:45:31 · 25262 阅读 · 2 评论 -
一个文件有N个单词,每行一个,其中一个单词出现的次数大于N/2,怎么样才能快速找出这个单词?
熟悉hash运算的人可能很快能够想到应用hash映射来解决这个问题。就是建立key-value表,统计每个单词出现的次数,这样只需要遍历所有单词一遍就能够精确的统计出每个单词出现的次数。然后在遍历hash表,找到value值大于(注意不是等于)n/2的那个key值。算法的时间负责度和空间复杂度都为O(N),从不严格的意义上讲。找单词和找数字是一个道理,索性就给出了找数字的例子,因为找数字还有另外一原创 2012-12-28 13:30:40 · 2450 阅读 · 0 评论 -
数组连续子序列的最大的和-四种算法,四种时间复杂度
给定一组数据:31, -41, 59, 26, -53, 58, 97, -93, -23, 84。要求找到这组数据中连和最大的子序列,相信很多人都看过这个算法,能够直接给出线性时间复杂度的解法。但是还是有其他解法的,而且是循序渐进的,从O(n^3), O(n^2), O(n*logn)到O(n)。在开始算法之前要进行一下约定,如果当前输入的都是负数的时候,综合最大的子序列是空的,总和为0.原创 2012-12-25 22:05:57 · 5582 阅读 · 2 评论 -
kmp算法源码-经过比较,这个源码的速度应该是移动最快的。
#include#include#includevoid get_next(char *p, int len, int *next) { int j = -1; int i = 0; next[i] = -1; while(i < len - 1) { if(j == -1 || p[i] == p[j]) { ++i; ++j; if(p[i] != p[j]原创 2012-12-08 14:17:06 · 1155 阅读 · 0 评论 -
给定一个数字,怎么判断它是不是回文形式的?
给定一个数字,例如:1234554321,怎么才能判断这个数是不是回文呢?要求时间复杂度是O(n),空间复杂度是O(1).约定负数和0都不是回文。如果要求不是空间复杂度是O(1),那可以直接把数字转换成字符串,用sprintf函数,然后判断这个字符串是不是回文。第一种思路就是把这个数字,比如123321进行反转,然后把反转后的结果和原来的数字进行比较,如果相等那么就说明是这个数字是回文形式原创 2013-01-21 10:43:07 · 5298 阅读 · 1 评论 -
Given a sequence of numbers (or array).Find the maximum distance between all the same numbers.
题目要求如下:给定一列数组,找出在这个数组中相同数据出现位置的最大差值,例如:1, 2, 3, 4, 1, 1, 7, 4, max(1) = 5, max(2) = 0, max(4) = 4; 给出两种方法,一种是使用hash,这种方法比较有局限性,首先,如果数组中的某一个值比较大的话,应用hash就会比较浪费空间,定义这样的数据结构:typedef struct data_s原创 2013-05-02 14:33:32 · 1144 阅读 · 0 评论 -
输入一个无符号整数,用最少的步骤将该数变为1
输入一个无符号整数n,用最少的步骤将该数变为1,当n为偶数时可以采取的步骤是除2的形式,当n为奇数的时候可以采取加1或者减1的操作。#include #include using namespace std;int min(int a, int b) { if (a < b) return a; return b;}int get_pow(uint num) { if原创 2014-12-16 17:15:19 · 3875 阅读 · 2 评论 -
杨氏矩阵-young tableau 算法分析+实现
简介:young tableau 是一个很奇特的数据结构,它的性质是堆和BST(二叉查找树)的结合,对于查找它的效率优于堆,对于删除和插入它比BST更方便。young tableau是一个m*n的矩阵,可以用二维数组来表示,定义如下:1,杨氏矩阵的每一行和每一列的元素都以非递减或者非递增的形式排列。2,如果矩阵中的某一个位置没有存储元素,则把它的值置为无穷大。先给出一个一位数组,和原创 2013-01-08 18:06:56 · 4336 阅读 · 0 评论 -
链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现
题目中最重要的就是学会一种方法,就是把链表中长度为k的一段从链表中摘除,翻转之后在将其衔接回链表。这是主要的思绪,以下按照此思路给出程序:#includeusing namespace std;typedef struct LNode { int m_nValue; struct LNode* m_pNext;}LNode;LNode* reverseList(LN原创 2013-11-10 21:47:32 · 6331 阅读 · 0 评论 -
顺时针打印nxn的矩阵
对于如下的矩阵进行顺时针的打印:1 2 34 5 67 8 9打印结果是:1,2,3,6,9,8,7,4,5这个打印很简单,就是按圈进行打印,看这个矩阵的维度是3,那么一共有一圈,和一个独立的点5,如果维度是4,那么就有两圈,没有独立的点,独立点进行单独处理,那么按圈进行打印,就要简单的多。自己拿出草稿纸画画就好,关键点是第几圈要有记录。#include原创 2013-11-10 20:48:56 · 3238 阅读 · 0 评论 -
given a single link list (l0, l1, l2, l3,,,ln), and transform it to (l0, ln, l1, ln-2, l2, ln-3)
一道微软的编程题,趁午休的时间做了一下,如果有不对之处,希望指出。#include#includeusing namespace std;typedef struct LNode { char m_nValue; struct LNode* p_mNext;}LNode;LNode* createList(char* pStr) { int strLen = strle原创 2013-11-08 13:57:36 · 2817 阅读 · 0 评论 -
An in-place algorithm for String Transformation
不好意思,我没有进行翻译,觉得原文讲的很好:Given a string, move all even positioned elements to end of string. While moving elements, keep the relative order of all even positioned and odd positioned elements same. For翻译 2013-05-10 16:02:52 · 1172 阅读 · 0 评论 -
把二叉树转换成双向链表
记得这是一道微软的面试题,想了很长时间不知道怎么做,近期看别人的博客,找到了算法,自己实现了一下,下面是算法的叙述:1. If left subtree exists, process the left subtree…..1.a) Recursively convert the left subtree to DLL.…..1.b) Then find inorder predece原创 2013-05-08 11:26:33 · 1218 阅读 · 0 评论 -
Given an array of integers, sort the array according to frequency of elements
Given an array of integers, sort the array according to frequency of elements. For example, if the input array is {2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12}, then modify the array to {3, 3, 3, 3, 2, 2, 2,原创 2013-05-07 15:23:45 · 1381 阅读 · 0 评论 -
快捷键的难题
从一个编程网站上搞过来的题目,自己解了一下,发现就是类似于字符串旋转的问题:题目描述:Windows 7系统有很多的快捷键,Y同学最喜欢的快捷键就是Alt+Tab组合键,可以进行方便的进行多窗口之间的切换。为了方便,去掉一些复杂规则后,Y同学进行了如下定义。1.窗口队列:w1,w2,……wi……wn, (12.一次切换动作switch(x):(1)按住Alt键不放(2)敲击原创 2013-05-05 10:42:42 · 1096 阅读 · 0 评论 -
给图的顶点着色
给出一个无向图和一个数字m,此数字代表了允许使用颜色的种类,判断是否至多可以应用m种颜色,将图的每个顶点着色,并且相邻节点着的颜色不同。 输入: 1, 二维矩阵 graph[V][V],其中V代表图中顶点的个数,而矩阵本身是图的邻接矩阵表示形式。 2,对于graph[V][V]的理解是,graph[i][j], 如果i==j,那么graph[i][j]为1翻译 2013-05-04 15:49:39 · 3173 阅读 · 0 评论 -
反转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。一个比较好的思路是将给定句子中的所有字母进行反转 成:!margorp xunil evol I,然后再对给定的每个单词进行反转,程序:#include原创 2012-09-19 21:27:15 · 3423 阅读 · 0 评论 -
单链表的反转,原来还可以反转的这么艺术
通常会碰到这个题目,相信这实际开发中这个问题也很有用途。开始遇到这个问题的时候,我相信大家都能容易想到解决这个问题最通用的方法,就是设置三个变量,p,q,t,分别指向三个节点,然后遍历一遍单链表,改变各个节点的指针的指向,但是这个方法会很绕,如果没有清晰的思路很容易把自己绕晕。下面贴上应用三个指针的代码,大家看懂代码之后我在继续分析。#include#include#includetyped原创 2012-09-28 21:14:42 · 1140 阅读 · 0 评论 -
长度为1的线段,随机在其上选择两点,将线段分为三段,问这3个字段能组成一 个三角形的概率是多少
http://blog.csdn.net/qibaoyuan/article/details/5978325这是引用博客的地址,作者分析的很好,但是为了清晰还是说明一点,就是把x,y的取值放在坐标轴上进行考虑,从0到1的那段。那三条边的长度就为x,y-x,1-y。假设我们选择的两个点的坐标是x和y(先假设x 那么由三角形两边和大于第三边的性质,有: x+y-x>1-y原创 2012-10-19 17:32:06 · 10741 阅读 · 1 评论 -
Parallel In-Place Merge
Merging sorted arrays in parallel and in place can be done very efficiently, using this algorithm. Comparisons with the performance of similar STL functions are included.IntroductionIn my ar原创 2012-10-29 21:27:56 · 1856 阅读 · 0 评论 -
block swaping 原地归并排序的基础(in-place parallel merge sort)
这三种方法均验证过,结果很准确。个人最喜欢第三种方法,就是reversal那种,简单明了,而且速度还很快,看具体应用于哪种场合。Algorithms for swapping blocks of data appear simple, but vary widely in their performance profiles. Choosing the right one can be原创 2012-10-29 20:16:47 · 2264 阅读 · 0 评论 -
如何找到一个数组中的两个数,他们的和为0
这个题目我的想法是首先对数组进行排序,应用快速排序。排好顺序之后,设定两个指针,一个指向数组的前端,一个指向数组的末端,然后两个数相加,如果大于0,则后端指针向前移动,如果小于0,则前面指针向后移动。因为这样的数组中肯定会有负数的。如果等于0,则找到两个数,并打印出来。这个解法的时间复杂度为O(nlogn)+O(n).下面给出代码,如果有不正确的地方,希望大家指出。#includeint par原创 2012-10-17 21:04:42 · 2993 阅读 · 0 评论 -
1000瓶水中找 出有毒的那瓶,毒性一周后发作,一周内最少需要多少只老鼠
这个题是对bit位的应用,1000接近1024,所以需要10个bit位,对瓶子进行编号,从0到999,这样需要10只老鼠。瓶子的编号分别为:00000,0000000000,0000100000,00010,00000,0001100000,0010100000,00111。。。。。。11111,00111同时给老鼠编号,从1,2,...10,从低位开始,让第n原创 2012-10-17 22:28:41 · 5731 阅读 · 4 评论 -
对字符串HELL0_HULU中的字符进行二进制编码,使得字符串的编码长度尽可能短,最短长度为?
这个题主要考察的是对haffman树的解法。先给出代码,因为其中还有点小错误,但是影响不大。#include #include#includetypedef struct HuffmanNode{ unsigned int weight; int parent,lchild,rchild;}HuffmanNode,*HuffmanTree;typedef char ** H原创 2012-10-16 17:19:19 · 5223 阅读 · 1 评论 -
一种计算机,其有如下原子功能
100、一种计算机,其有如下原子功能:1、赋值 a=b2、+1操作,++a; a+1;3、循环,但是只支持按次数的循环 for(变量名){/*循环里面对变量的修改不影响循环次数*/}4、只能处理0和正整数5、函数调用 fun(参数列表)请用伪代码的形式分别在这个计算机上编程实现变量的加法、减法、乘法。fun_add(a , b){}fun_转载 2012-10-16 11:29:57 · 1335 阅读 · 0 评论 -
一个数是否是另一个数的平方
这个题目肯定不能用sqrt这个函数,如果用了话就违背了本题的考察点。为了解析这个题目,给出一个数学公式:(n+1)^2=n^2+(2n+1)(n+1)^2=(n-1)^2+[2(n-1)+1]+(2n+1).....(n+1)^2=1+(2*1+1)+(2*2+1)+...+[2(n-1)+1]+(2n+1)可以自己动手验证这个公式的正确性。下面给出代码:(注:下面的代原创 2012-10-16 10:56:07 · 3339 阅读 · 0 评论 -
fibonacci数列和跳台阶问题
首先百度之后知道,fibonacci数列其实在科学中有着广泛的应用,下面一句话引子百度百科:在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。了解fibonacci数列的人都知道它的推到公式: 0 n=0f(n)=1 n=1 f(n-1)+f(n-2) n>原创 2012-10-09 15:28:12 · 1005 阅读 · 0 评论 -
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
这个问题开始我考虑的是把前后的两个奇偶节点内的数据相交换,这岂不是很简单,但是后来一想,不是那么回事,这个题目主要是考察我们对单链表操作的理解。所以引发我个人的一个小观点,就是学习的目的不是为了追求结果,而且要学到方法。我们需要注重的不是问题的结果,而是求解的过程。所以,这个题本着原则来讲,是需要改变指针的指向的。如果是偶数个节点,那很好办,奇偶对调,如果是奇数个节点,那么最后一个节点肯定不用原创 2012-09-27 17:48:38 · 4506 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
二元查找树的定义为:(1)若左子树不空,则左子树上所有节点的值均小于其根节点的值。(2)若右子树不空,则右子树上所有节点的值均小于其跟节点的值(3)其左右子树也均为二叉查找树。那么先给定一个数字序列5、7、6、9、11、10、8,判断这个序列是否是二元查找树的后根遍历。可以回想一下后序遍历的性质,先访问左子树,然后访问右子树,最后访问根节点。结合以上这些性质,就可以理解到,应该从给原创 2012-10-21 19:57:01 · 2837 阅读 · 1 评论 -
给一个浮点数序列,取最大乘积子序列的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积子序列为3,0.5,8
#include#include#includefloat get_max(float a,float b,float c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }}float get_min(flo原创 2012-10-21 21:50:30 · 1582 阅读 · 0 评论 -
求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3
求旋转数组的最小元素(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。解题思路:首先,想到得思路肯定是把这个数组进行右旋转(要理解旋转的概念,就是比如说:abcdef,要进行右旋2位,那么移动后的结果为efabcd)原创 2012-09-16 15:12:28 · 2308 阅读 · 0 评论 -
判断两个数组中是否有相同的数字
首先要说声不好意思,因为这个题说的很模糊,但是也算是两个方向吧。也就是说,给定的两个数组是否有序,如果无序的话那么解决这个问题所用的时间复杂度就是nlog(n),如果给定的两个数组有序,那么解决方法的时间复杂度会是O(n)。下面会给出两个解法。(假设数组是有序的,因为如果无序的话直接用快速排序或者堆排序在nlog(n)就可以解决)。第一种方法,就是应用折半查找,依次从第一个数组中取出一个元素,原创 2012-11-19 20:32:15 · 9839 阅读 · 0 评论 -
数组al[0,mid-1] 和 al[mid,num-1],都分别有序。将其merge成有序数组al[0,num-1],要求空间复杂度O(1)
这个涉及到原地归并排序和block swap两个算法,所以如果有兴趣的读者先读我空间的 Parallel In-Place Merge 和 block swapping两篇文章。首先给出原地归并排序的基本原理图:首先把给定的数组分成两部分,前一部分包括[l,m]中的元素,而后者则包括(m,r]中的元素。然后找到第一个数组中的中间值,也就是q1=(l+m)/2,q1位置的元素就是我们原创 2012-11-12 21:03:39 · 2608 阅读 · 0 评论