算法 (Algorithm)
文章平均质量分 67
beiyeqingteng
这个作者很懒,什么都没留下…
展开
-
插入排序算法(Insertion Sort)的两种实现
插入排序算法的两种实现。原创 2010-07-15 04:21:00 · 4587 阅读 · 0 评论 -
Radix sort
Radix sort and its implementation原创 2010-07-19 00:42:00 · 1643 阅读 · 0 评论 -
Shell sort and its implementation
Shell sort and its implementation原创 2010-07-21 07:05:00 · 622 阅读 · 0 评论 -
Bubble sort and its implementation
Bubble sort and its implementation.原创 2010-07-23 07:27:00 · 799 阅读 · 0 评论 -
Selection sort and its implementation
selection sort and its implementation.原创 2010-07-21 07:20:00 · 555 阅读 · 0 评论 -
十七道海量数据处理面试题与Bit-map详解
十七道海量数据处理面试题与Bit-map详解作者:小桥流水,redfox66,July。前言 本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文转载 2011-10-30 13:32:05 · 1123 阅读 · 0 评论 -
检查一个数组是否可能是一棵二叉查询树后序遍历的结果 [No. 6]
问题:给一个数组,检查它是否可能是一棵二叉查询树后序遍历的结果。换句话说,是否存在一棵二叉查询树,对它进行后序遍历后,得到的数组和给定的数组完全一样。比如,对上面这个二叉查询树后序遍历后,得到的数组是:[1, 4, 7, 6, 3, 13, 14, 10, 8]。思路:因为二叉树后序遍历的时候,先左后右然后中间。所以,数组的最后一个一定是整个二叉查询树的根(比如 8),而且原创 2011-12-14 13:39:39 · 1415 阅读 · 0 评论 -
判断字符串可否通过另一个字符串的循环移位得到 [No. 34]
假设字符串s1=AABCD,s2=CDAA,判断s2是否可以通过S1的循环移位得到字符串包含。如 s1移两位: 1.ABCDA->2.BCDAA 则此时包含了 S2="CDAA"解题思路: 分解s1的循环移位得到: AABCD,ABCDA,BCDAA,CDAAB,..... 如果我们将前面移走的字符串保留下来,则有: AABCD,AABCDA,AABCDAA,AABCDAA转载 2011-10-30 22:24:23 · 2808 阅读 · 0 评论 -
迷宫问题 [No. 8]
问题:在一个n*m的迷宫里,每一个坐标点有两种可能: 0 或 1。0表示该位置允许通过,1表示该位置不允许通过。从坐标(0,0)点出发,找出所有通往出口(n-1, m-1) 的路径。如果我们用二维矩阵来表示,那么地图可以表示成:0 0 0 0 01 0 1 0 10 0 0 010 1 0 0 00 0 0 1 0在上面一个例子里,其中一条路径为0,0 -> 0原创 2012-01-24 13:59:13 · 1321 阅读 · 0 评论 -
一个字典,给你一个word找出所有anagram [No. 18]
所谓anagram, 就是一个词A通过里面字母顺序的变换得到另一个词B,那个B就是A的anagram。现在给你一个词A,然后给你一个字典,这个字典里含有很多次,在字典里找出所有A 的 anagram.这道题的关键点是,怎么去判断两个单词是否是anagram。 这里用到的方法是 把A 进行排序,比如如果A 是 test, 排序后变成 estt, 然后我们把所有要进行比较的也通过排序处理,如果原创 2011-11-11 13:51:32 · 2210 阅读 · 0 评论 -
输入一个正数 n,输出所有和为 n 的连续正数序列 [No. 25]
问题:输入一个正数n,输出所有和为 n 的连续正数序列。例如:输入15,由于1+2+3+4+5 = 4+5+6 = 7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:首先,假设我们是从6开始判断的,因为 6 比 15 小, 而且由于要求序列是连续的,所以,下一次只能选择5,剩余的值是 15 - 6 = 9,因为5 比9 小,我们只能再继续下去,这次选择是 4, 而剩余原创 2011-12-31 09:32:58 · 1783 阅读 · 0 评论 -
找出数组中两个只出现一次的数字 [No. 30]
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的转载 2011-11-11 05:50:32 · 3533 阅读 · 0 评论 -
implement a queue by using two stacks [No. 31]
For a queue, we need to implement enqueue and dequeue methods.The idea is if we perform enqueue operation, we simply put that input into the stack 1 by performing the push operation; when we perform原创 2011-10-26 06:14:15 · 988 阅读 · 0 评论 -
判断一个单链表是否有环,如果有,找出环的起始位置 [No. 36]
How can one determine whether a singly linked list has a cycle?第一种方法是从单链表head开始,每遍历一个,就把那个node放在hashset里,走到下一个的时候,把该node放在hashset里查找,如果有相同的,就表示有环,如果走到单链表最后一个node,在hashset里都没有重复的node,就表示没有环。 这种方法需要O(原创 2011-11-11 14:26:32 · 2874 阅读 · 1 评论 -
pow(double a,int b) [No. 41]
实现pow(double a, int b) 最简单直接的方法就是用一个循环使得result *= a 做b次,但是,这样的方法不是最优的,比如我们求2^100, 我们只需要得到2^50就可以了,因为2^100 = 2^50 * 2^50。而要求2^50,只需要得到2^25就可以了,所以,按照这样一个思路,要求pow(double a,int b),我们可以按照如下方法做:double p原创 2011-11-15 14:58:50 · 1516 阅读 · 1 评论 -
最长递增子序列 [No. 39]
给定一个长度为n的数组,找出一个最长的单调递增子序列(不一定连续,当时先后顺序不能乱)。 更正式的定义是:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1。比如数组A 为{10, 11, 12, 13, 1, 2, 3, 15}, 那么最长递增子序列为{10,11,12,13,15}。这道题用DP解,假设从第1位到第 j 位的最长的子序列长度为L(j),那原创 2011-11-10 09:00:59 · 2734 阅读 · 0 评论 -
字符串排列和组合的JAVA实现 [No. 44]
字符串的组合:给一个字符串,比如ABC, 把所有的组合,即:A, B, C, AB, AC, BC, ABC, 都找出来。解题思路:假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个原创 2011-12-08 05:25:10 · 12161 阅读 · 4 评论 -
交换序列a,b中的元素,使|sum(a)-sum(b)|最小 [No. 49]
有两个序列a,b,大小都为n,序列元素的值任意整数,无序.要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如: int[] a = {100,99,98,1,2, 3};int[] b = {1, 2, 3, 4,5,40}; 求解思路: 当前数组a和数组b的和之差为 A = sum(a) - sum(原创 2011-11-11 03:33:39 · 4890 阅读 · 5 评论 -
How HashMap works in Java
How HashMap works in Java?How HashMap works in Java or sometime how get method work in HashMap is common interview questions now days. Almost everybody who worked in Java knows what hashMap is, wh转载 2012-01-01 06:14:22 · 1541 阅读 · 0 评论 -
把手机键盘输入转化成短消息 [No. 52]
手机键盘每个数字对应的字符如下:0 ---> "0";1 ---> "1";2 --- > "ABC2";3 ---> "DEF3";4 ---> "GHI4";5 ---> "JKL5";6 ---> "MNO6";7 ---> "PQRS7";8 ---> "TUV8";9 ---> "WXYZ9";* ---> 空格;# ---> 断开;原创 2012-02-29 06:32:08 · 1614 阅读 · 0 评论 -
把一个字符串通过相邻字符移位变成另一个字符串 [No. 54]
问题:给你两个字符串,比如 ABCD 和 DBCA,通过交换相邻字符的位置,把第一个字符串,变成第二个字符串,打印所有的步骤。比如从ABCD到DBCA,步骤是:ABCD ---> BACD ---> BCAD ---> BCDA ---> BDCA ---> DBCA分析:如果两个字符串里所含的字符是一样的,只是位置不一样,我们是可以证明通过交换相邻的字符,能够从一个字符串变成另原创 2012-02-29 07:02:50 · 4420 阅读 · 0 评论 -
找出长度为n的所有数字,里面相邻数字不能一样 [No.53]
问题:给你一个数字长度,比如是 n ,那么打印出所有长度为 n 的数字,但是相邻数字不能一样。假如n = 3,那么121是可以的,112是不行的。分析:首先,该数字的第一个位置可以是1-9任意值,然后第二个位置可以是1-9任意值,但是不能和前面一个值相等。对于第三个位置,道理是一样的,所以,这里我们需要用到递归。对于每一个位置,我们需要遍历所有与前面位置不同的值。public原创 2012-02-29 06:44:31 · 1568 阅读 · 0 评论 -
间隔问题2 [No. 57]
问题:给一组间隔,把这些间隔合并,使得间隔之间不会有重合。比如:[1, 5], [3, 8], [10, 20], [7, 9] 合并后变成 [1, 9], [10, 20]。分析:首先,因为我们需要判断是否两个间隔是否重合,这样才能合并,检查两个间隔是否重合的代码是: /* * s1: start point of interval 1 * e1: end point原创 2012-03-28 12:59:29 · 1012 阅读 · 0 评论 -
间隔问题 [No. 56]
问题:给定多个不重合的间隔(interval),比如 [3, 8] [ 12, 17] [22, 29], 然后插入一个新的间隔, 比如 [ 5, 15], 求最后不重合的间隔。比如,起初的不重合间隔变成 [3, 17] [22, 29].分析:首先,我们要知道怎么确定两个间隔是重合的。比如[1, 5] [3, 7] 是重合的,[1, 5] [6, 7] 是不重合的。那么,观察后发现,原创 2012-03-28 09:12:59 · 1335 阅读 · 0 评论 -
间隔问题3 [No. 58]
问题:给一组间隔,找出一个点,使得穿过改点的间隔数量最大, 时间复杂度不能超过 O(N lg N)。比如有一组间隔为[1, 5] [ 3, 7] [2, 4] [8, 9], 那么对于点 3.5, 有3个间隔都包含这个点,但是对于点 8.5,只有一个间隔包含该点。所以,最后答案是 3.5. (当然,3.6, 或者 3.7 都可以)。分析:对于一组间隔,我们把它所有间隔的起始值和结束值放原创 2012-03-29 10:31:22 · 1571 阅读 · 0 评论 -
Java实现atoi函数 [#47]
问题:把一个字符串转成一个整数。思路:其实,这道题考的不是怎么去把一个数转成一个整数,而是考你是否能够把所有的情况都考虑完全,我们应该考虑的因素如下:1. 这个字符串是否是空的。2. 这个字符串是否有非法字符(非0-9之间的字符)。3.这个数是正数或者是负数的情况(第一个字符是否为+,-)。4. 是否存在溢出的情况(这个比较难考虑到)。public static原创 2011-11-22 13:46:08 · 5553 阅读 · 0 评论 -
把一个字符串转成double类型的数[# 61]
问题:给一个字符串,比如“-12.05”,把它转成相应的double类型的数。分析:在进行转换的时候,要注意以下问题:1. 该字符串是否为空2. 是否该字符串含有符号;3. 该字符串内是否有非法字符;4. 小数点的位置;5. 该数是否越界;代码如下:public static double atod(String str) throws Exception原创 2012-04-14 00:25:45 · 4095 阅读 · 0 评论 -
在数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数[#63]。
问题:一个int数组, 比如 array[],里面数据无任何限制,要求求出所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。分析:最原始的方法是检查每一个数 array[i] ,看是否左边的数都小于等于它,右边的数都大于等于它。这样做的话,要找出所有这样的数,时间复杂度为O(N^2)。其实可以有更简单的方法,我们原创 2011-12-31 11:54:34 · 5601 阅读 · 0 评论 -
找出第k大的数[No. 64]
问题:从一个数组里面,找出第K大的数。题目很简单,要想把第K个数找出来,其实也挺容易的。第一种方法:无非就是先排序,比如用Merge Sort算法,整个算法复杂度为 O(NlgN), 然后找到第K个即可。第二种方法:如果k很小,比如第五个最大的数,而整个数组的长度非常的大,那么,还有一种方法就是,我做k遍找最大的数,每做一遍,就把最大的放在数组的最后面,然后减少数组扫描的范围,就可原创 2011-11-20 04:54:03 · 9787 阅读 · 1 评论 -
Java实现最长公共子序列 [No. 73]
最长公共子序列(LCS)定义:一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。比如数列A = “abcdef”, B = “adefcb”. 那么两个数列的公共子序列是"adef". 最长公共子序列和最长公共子字符串是有区别的,公共子序列里的元素可以不相邻,但是公共子字符串必须是连接在一起的。比如A和B的公共子字符串原创 2011-11-17 12:07:16 · 12300 阅读 · 2 评论 -
把一个排好序的数组数组转化成一颗平衡二叉查询树 [No. 79]
Solution:If you would have to choose an array element to be the root of a balanced BST, which element would you pick? The root of a balanced BST should be the middle element from the sorted array.转载 2011-08-09 12:16:43 · 2136 阅读 · 0 评论 -
扑克洗牌 [No. 69]
给你一副牌,牌的张数为 N ,把它分成 K 堆,每一堆有 T = ( N / K )张 (假定N 能够被 K 整除)。分法如下:从牌的底部取 T 张给第一堆(顺序不变),再从底部取 T 张给第二堆,,,,最后把剩余的 T 张牌给最后一堆。比如,一副牌为 A B C D E F (顺序从上到下),如果把牌分成三堆,第一堆为 E F, 第二堆为 C D,第三堆为 A B。把牌分好以后,然后再重新合原创 2012-01-05 02:06:25 · 2042 阅读 · 0 评论 -
判断有向图是否有环 [No. 75]
要判断一个有向图是否有环,我们可以选择选择BFS, DFS 或者 Topological sorting. 用BFS或者DFS进行判断时,我们主要判断要被访问的node是否已经被访问过,如果被访问过,就有环。利用topological sorting进行判断的时候,就是判断node是否只有一个node和它连接(算法第八行)(按照树的说法,也就是看那个点是否只有一个父节点)。代码如下(来自wik原创 2011-11-14 01:55:11 · 3403 阅读 · 0 评论 -
字符串匹配(String matching)[No. 76]
字符串匹配就是给定两个字符串 T 和 P, 看T是否完全包含P。 比如 T = abcdeff, P = abce,则P不匹配T,如果P = eff,则P匹配T。非常原始的做法就是从T的第一个字母开始和P进行比较,如果达到P的最后一个字母仍旧是相同的,那么就成立,否则,从T的第二个字母有开始比较;直到T的最后一个字母。这种做法复杂度为O(nm). n 是T的长度, m是P的长度。本文文章介原创 2011-09-18 04:26:28 · 1254 阅读 · 0 评论 -
骆驼和玉米 [No. 80]
一个骆驮运玉米从A地到B地, 骆驮一次最多运1000个玉米,A地距离B地有1000米远. 而骆驮每走1米就要吃一个玉米.现在有3000个玉米.现在要从A运到B. 问到B地最多还能剩下多少个玉米?wantalcs给出的答案是: class Program{ private static readonly int _maxLoad = 1000; //单次运载上限 pr转载 2010-07-15 09:21:00 · 2215 阅读 · 0 评论 -
平均需要扔多少次硬币才能够得到连续2个正面 [# 12]
给你一个硬币,扔到正面的概率是p,扔到负面的概率是 1- p。问题是:平均需要扔多少次,才能得到连续的2个正面。例子:假设正面用 A 表示, 负面是 B表示 ,那么两个连续正面必须是 AA挨着,不能是 A B A B 这样的。分析:假设需要 T 次。 如果我们扔的第一次就是负面,那么第一次就白搭,我们还需要再扔 T 次 (有点混,需要认真思考把它想清楚)。如果我们第一次扔的是正面,那原创 2012-01-09 14:09:41 · 3654 阅读 · 3 评论 -
快速排序算法递归和非递归实现 [# 29]
Quick sort algorithm is quite like the merge sort, cause both of them use the idea of divide-and-conquer, but be aware, quick sort doesn't conquer it subproblems, cause when the problem is divided int原创 2010-07-18 04:56:00 · 889 阅读 · 0 评论 -
一道有意思的Amazon的概率面试题[# 71]
该问题包含两个子问题:子问题1:给你一个骰子,你扔到几,机器将会给你相应的金钱。比如,你扔到6,机器会返回你6块钱,你扔到1,机器会返回你1块钱。请问,你愿意最多花多少钱玩一次?子问题2:在子问题1里,你只能扔一次,现在呢,可以给你两次机会,但是你自己也可以选择只扔一次。但返回的钱以最后一次为准。比如,第一次你扔了6,你把第二次机会就放弃了,这样机器会返给你6块钱。但是,假设你第一次扔原创 2012-05-06 13:55:26 · 9014 阅读 · 0 评论 -
反转单向链表(reverse a singly linked list)(单个反转) [# 7]
问题:给一个单向链表,把它从头到尾反转过来。比如: a -> b -> c ->d 反过来就是 d -> c -> b -> a 。这里讲解两种方法:第一种方法就是把每个Node按照顺序存入到一个stack里面,这样,最后面一个就在最上面了。然后,把每一个再取出来,这样顺序就换过来了。public static Node reverse(Node head) { Stack原创 2011-12-01 11:31:57 · 9217 阅读 · 0 评论 -
两两反转单向链表 (reverse a singly linked list in pair ) [#22]
两两反转单项链表就是把每两个数反转一次。如下:A -> B -> C ->D -> E -> F ->G -> H -> I 两两反转后变为 B -> A -> D ->C -> F -> E ->H -> G -> I分析:我们需要两个“指针”指着当前要反转的两个值。两两反转后,我们还需要记录下一个的值,换句话说,我们反转 A 和 B 后, 需要记录 C 值,我们才能够不断向下走,原创 2011-12-07 12:12:07 · 2637 阅读 · 3 评论