自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Yuwen's Hero

专注面试题, 博客 http://blog.csdn.net/beiyeqingteng 的镜像站

  • 博客(201)
  • 收藏
  • 关注

原创 shuffle a deck of cards

Question:You are given a deck of 52 cards, and you need to shuffle the cards and make sure the order is random.Solution:We can simply use the Durstenfeld and Knuth algorithm to shuffle the cards

2012-12-02 06:36:06 1984

原创 不通过比较,找出两个数的最大值

问题:比如:给定两个值 5和10,不通过比较,直接找出最大值。分析:一旦涉及到不用比较找最大值,想都不用想,一般只能通过位运算来实现。 max = a - ((a-b)&((a-b)>>31))或者max = ((a+b)+|a-b|)/2如果找最小值,我们只需把两个值相加,减去max即可。转载请注明出处:http://blog.csdn.net/beiye

2012-11-19 02:21:28 937

原创 n 个人围成一圈(编号1-n),数到3的出列,最后剩下的人的编号

问题:n 个人围成一圈(编号1-n),数到3的出列,然后又从头开始数,一直循环到最后一个人,请问最后剩下的人的编号?public int numberToExit(int total, int interval) { boolean[] arr = new boolean[total]; for(int i = 0; i < arr.length; i++) { arr[i]

2012-11-18 16:46:57 4155

原创 编辑距离 (edit distance)

问题:给定两个字符串 A和B,由A转成B所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将A(kitten)转成B(sitting):sitten (k→s)替换sittin (e→i)替换sitting (→g)插入思路:如果我们用 i 表示当前字符串 A 的下标,j 表示当前字符串 B 的下标。 如果我们用d

2012-10-24 02:59:34 13613

原创 版本号比较

问题:给定两个版本号,比较哪一个版本号更新。比如 1.2.9 比 1.2.4 新。 1.0.1 比 1.0 新。 思路:当比较版本号时,我们需要从头到尾比较每一组数据。所以,我们需要首先得到版本号的一个数字,第二个数字,第三个数字,然后和另一个版本号码所对应的数字进行比较。代码:public class VersionComparison { public static vo

2012-10-23 11:10:02 1362 1

原创 逆波兰表示法

前言:在逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做

2012-10-13 10:13:08 13892 2

原创 01背包问题

问题:有 N 件物品和一个容量为 M 的背包。第 i 件物品的体积是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。分析:这个问题的难点在于它有很多种组合情况,所以,这个问题看似很难在 polynomial 时间内找出最优解。但是,我们的确可以在polynomial时间内找出来。思路如下:对于问题本身,背包的容量是物品的

2012-10-09 08:55:17 783

原创 return the minimum value in a stack

Implement a stack which not only has push, pop, but also is able to return the minimum value within O(1) time.public class StackWithMin { Stack stack1 = new Stack(); Stack stack2 = new Stack();

2012-10-05 08:27:40 704

原创 一个数组的值先从小到大递增后从大到小递减,找出最大的值

问题:给定一个数组,其值先从小到大递增后从大到小递减,找出最大的值。思路:最简单的办法就是从第二个值开始,判断是否满足 A[i] > A[i-1] && A[i] > A[i+1]. 如果满足,i 就是那个最大值的下标。该算法复杂度为O(n).我们可以改进这种算法,因为这个数组是排好序的,所以我们可以利用二分查找的思想,更快速的找到最大值,时间复杂度为O(lg

2012-10-05 07:42:00 1864

原创 Quick Sort (快速排序)

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

2012-10-04 20:42:51 802

原创 堆排序(Heap Sort)算法的实现

堆排序算法思想非常简单,先把一个数组看成一个heap, 在下面的实现中,我使用的是max heap, 也就是说根总是比叶子大。所以我们第一步就是建立max heap。建立完毕以后,很明显这个heap的root就是最大的,把最大的根放在数组的最后一个位置,把数组长度缩小一个位置,这样最大的那个数就不会再参与到下次的排序当中,这时,除了根以外,heap的其它部分都保持max heap的特性,所以我们需

2012-10-04 12:06:47 1117 1

原创 归并排序(Merge sort)算法

Merge sort 算法的思想就是把数组分成更小的数组,合并的时候再排序。由于是二分,所以总的时间为 T(n) = 2 T(n/2) + \theta (n) = O(n * lgn)。public void mergeSort(int[] array, int start, int end) { if (start < end) { int mid = start + (end

2012-10-04 12:03:15 716

原创 添加最少括号使得给定括号字符串匹配

问题:给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。如:[]是匹配的,所需括号个数为 0.([])[]是匹配的, 所需括号个数为 0.((]是不匹配的, 所需最少括号个数为 3.([)]是不匹配的,所需最少括号个数为 2.分析:此题来自:http://blog.csd

2012-09-29 11:46:09 1738

原创 十度好友

问题:在社交网络里(比如 LinkedIn),如果A和B是好友,B和C是好友,但是A和C不是好友,那么C是A的二度好友,给定一个社交网络的关系图,如何找到某一个人的所以十度好友。分析:如果想找到一个人的十度好友,马上想到的方法应该会是使用深度搜索(DFS)。我们可以从一个点(A),使用深度搜索的方式,当到达第十个点的时候,记录该点并返回到上一层节点,然后继续进行深度搜索,直到A节点的所

2012-09-27 23:04:28 947

原创 分辨毒药和蒸馏水

问题:假设我们有很多瓶无色的液体(比如100瓶),其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在假设只有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,最多能够检测多少瓶液体的成分?分析:这道题的解法非常的巧妙,它使用了二进制来标注每一瓶液体。第二瓶标号是 00001,第三瓶标号是 00010,...

2012-09-27 21:41:04 1038

原创 一亿数据获取前100个最大值(基于最小堆和Quicksort)

前言:在CSDN上看到一个网友利用最小堆实现 “ 获取一亿数据获取前100个最大值” 。原帖请看:http://blog.csdn.net/yjflinchong/article/details/7533972。 然后自己利用quicksort的原理也写了一个程序来解决那个问题。通过测试,基于quicksort原理的方法平均运行时间是1.264秒,基于最小堆方法的平均运行时间是0.

2012-09-24 10:23:12 2299 1

转载 赛马问题

据说,这是Google的面试题。面试题目如下:一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?(不能使用撞大运的算法)很明显这是一个算法题,网上有很多贴子在讨论这个问题,不过都没有给出一个明确的答案。我想了想,想到下面的一个算法:1)分成5

2012-09-20 23:01:29 1321

原创 生男生女的面试题

问题:有一个国家的人们只想要男孩,每个家庭都会一直要孩子,直到他们得到一个男孩。如果生的是女孩,他们就会再生一个。如果生了男孩,就不再生了。那么,多年以后男孩多还是女孩多(前提:每次生男孩儿和女孩儿的概率是一样的。)这是在一个网友的面经里见到的一道题,好像也曾经是google的面试题。 网上的答案五花八门,而且大部分是错的,即使有正确的答案,看起来也非常的难懂。下面贴出的是一个

2012-09-19 23:45:53 2377

原创 二分查找算法(Binary Search)的实现

用二分查找在已排序的数组中查看该数组是否含有一个特定的值是非常快速的,时间复杂度为O(lgn). 二分查找思想很简单,但是实现的时候会在边界条件上出现一些意想不到的问题。 现贴出自己写的程序,供大家参考。第一个实现是基于迭代方式:/// /// implement Binary Search algorithm through iteration approach.///

2012-09-01 22:48:38 1079

原创 pow(double a,int b)

实现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),我们可以按照如下方法做:public c

2012-08-29 23:36:35 3234

原创 把二叉查找树转变成排序的双向链表

问题:给一个二叉查找树,把它转化成排序的双向链表,要求是不能使用额外的空间(常数空间是允许的)。例如:该二叉查找树的双向链表结构是 1 = 3 = 4 = 6 = 7 = 8 = 10 = 13 = 14分析:二叉查找树具有非常鲜明的递归结构,因此,在解决这道问题时,我们无可避免的会想到用递归。关键是如何递归呢?因为一个节点总是有一个左节点和右节点(如果存在),对于

2012-08-29 23:02:16 893

原创 implement a queue by using two stacks

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 perfo

2012-08-29 10:02:32 1052 1

原创 找出丢失的数字 (XOR)

问题:有一组数字,从1到n中减少了一个数,顺序也被打乱了,放在一个n-1的数组里,请找出丢失的数字。分析:这类题是频率很高的面试题,这类题的主要思路还是用XOR位操作,利用XOR位操作的原理是如果两个相同的数进行XOR操作,结果是0,而0与数A进行位操作,结果仍旧是A。所以,我们可以用1^2^...^n的结果逐个异或当前输入数据,而最后的结果是丢失的那个数字。时间复杂度为O(n),空间

2012-08-29 08:21:43 1548

原创 Remove Duplicates from Sorted Array

Question:Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.Do not allocate extra space for another array, you must do thi

2012-08-29 06:59:16 2039

原创 不占用任何额外空间的情况下交换两个数的值

问题:给你两个整数,比如 a = 10, b = 20,在不占用任何额外空间的条件下交换两个数的值。思路:首先,问题看起来是挺不可思议,但是也是挺有趣的。既然不能占用任何空间,只能在已有的变量上打主意。这里有两个方法,看完代码自己就能马上明白,所以就不多解释了。方法1:int a = 10;int b = 20;a = a^b;b = b^a;a = a^b;这个方

2012-08-29 06:55:54 912

原创 最大子矩阵和

前言:今天花了很长时间,看了无数人写的帖子,但是几乎没有人把这个问题一下子说得很清楚,所以,我把这个问题按照自己的思路写出来,希望能够把这个问题讲清楚。问题:求一个M*N的矩阵的最大子矩阵和。比如在如下这个矩阵中: 0 -2 -7  0 9  2 -6  2-4  1 -4  1-1  8  0 -2 拥有最大和的子矩阵为: 9 2-4 1-1 8

2012-08-27 07:48:07 701

原创 两个巨大正整数相加

问题:两个巨大整数相加,可能会造成溢出,或者它的大小已经超出基本数据类型的范围,所以,我们对巨大整数进行相加时,可以把它们转换成字符串,然后通过字符串的处理进行整数相加。这里有两种做法:第一种,把整数存在一个字符数组里进行处理。代码如下:public static String addThroughArray(String a, String b) { char[] adde

2012-08-24 12:18:54 944

原创 数组中出现次数超过一半的数字

问题:给定一个 int 数组,找出里面出现次数超过一半的数字。分析:首先,我们假定该数组中存在超过一半的数字,要把那个数字找出来,我们有以下方法:1. 排序。出现次数最大的那个数字一定是排序后第 n/2 + 1 那个值(假定是从1 开始数)。复杂度为O(nlgn).2. 遍历一遍数组,找出数组里的最大值max和最小值min,然后创建一个大小为 max - min + 1的数组,

2012-08-21 04:54:56 744

原创 二叉查询树的保存和读取

问题:把一个二叉查询树保存到一个文件,然后通过这个文件把这个二叉查询树还原出来。我们使用pre-order遍历把一个二叉查询树保存,原因是只有pre-order遍历是从root开始保存,这样,当我们读取的时候,才能够把那个值放在root。这里我用print来表示保存。public void preOrderWrite(Node root) { if (

2012-08-17 09:51:51 1621

原创 Fibonacci Number (斐波那契数列)

问题:F0 = 0F1 = 1Fn = Fn − 1 + Fn − 2求FnFibonacci数列是一个非常经典的用递归解决的问题。递归方法如下:public int F(int n) { if (n == 0) return 0; else if (n == 1) return 1; else return F(n - 1) + F(n - 2)

2012-08-12 05:32:14 1725

原创 Trie (prefix tree) 实现 (Java)

关注Trie 这种结构已经很久,Trie有一个很有趣的用途,那就是自动提示。而且,前不久在一次面试里,也需要用Trie来解答。所以,在此对这个数据结构进行总结。Trie,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。它有3个基本性

2012-08-12 05:07:19 7929

原创 LRU cache实现 (Java)

引子:我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本,但是,通过电话本查找还是很费时间的。但是,我们大脑能够记住的东西是一定的,我们只能记住自己最熟悉的,而长时间不熟悉的自然就忘记了。其实,计算机也用到了同样的一个概念,我们用缓存来存放以前读取

2012-08-12 00:01:35 10005

原创 顺时针打印矩阵 (JAVA实现)

问题:给定一个矩阵,从外向内顺时针打印矩阵中的每一个数字。例如:给定矩阵:1    2    3    45    6    7    89    10   11  1213   14   15  16输出应该为:{1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10}分析:问题的本质其实就是打印一

2012-07-28 05:55:42 4973

原创 给你一串股票价格,找出买点和卖点,使得利润最大

问题:Given array of integers representing historic stock prices. Find the buying and selling points to maximize the profit. 给你一个整数数组,数组的值代表股票的历史价格。找到买点和卖点,使得利润最大。假设数组为array = {3, 8, 1, 2, 19, 22, 2,

2012-07-23 10:38:53 2132

原创 求两个排序数组的并集

问题: 给你两个排序的数组,求两个数组的并集。比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么并集就是 1 2 3 4 5 7 8 9.代码:public class Union { public static void main(String[] args) { char[] ch1 = "abcde".toCharArray(); c

2012-07-23 06:37:53 4678

原创 求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集。 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5.分析:因为数组A B均排过序,所以,我们可以用两个“指针”分别指向两个数组的头部,如果其中一个比另一个小,移动小的那个数组的指针;如果相等,那么那个值是在交集里,保存该值,这时,同时移动两个数组的指针。一直这样操作下去,直到有一个指针已经超过

2012-07-23 06:12:51 911

原创 一道收集优惠券的面试题

问题:一个饭店发行一套优惠券,一套里面总共有 n 张不同的优惠券,顾客每次吃一次,可以随机获得一张优惠券。如果收集齐一套,下次吃饭可以打折。请问:顾客要来多少次才能收集齐一套优惠券?(是不是和小时候吃零食收集刮刮卡的情形是一样的,呵呵)分析:问题的难点在于顾客获得的优惠劵可能会有重复。但是,我们可以换一角度思考。假设顾客第一次来,他一定会得到一张独一无二的优惠券,第二次来的

2012-07-23 06:07:28 2546

原创 名人问题 (Celebrity problem)

问题:在一个房间里有 N 个人,其中一个是名人,所谓名人就是大家都认识他,但是他不认识任何人。其它人可能认识房间里面另外的一部分人。你可以问任何人问题,但是问题只能是:你认识 X 吗,对方回答 Yes or  No. 请问最少要问多少个问题才能把名人找出来?分析:我们把人编号,比如从1 到 N。 我们考虑最坏情况:你问每一个人是否认识 X ,如果大家都认识,那么 X 一定是

2012-07-23 06:06:16 1012

原创 找出字符串中对称的子字符串的最大长度(最长回文)

背景:所谓对称子字符串,就是这个子字符串要么是以其中一个词对称:比如 “aba”, “abcba”;要么就完全对称:比如"abba", "abccba"。问题:给你一个字符串,找出该字符串中对称的子字符串的最大长度。思路:首先,我们用字符数组 char[] array 来保持这个字符串,假设现在已经遍历到第 i 个字符,要找出以该字符为“中心”的最长对称字符串,我们需要用另两个

2012-07-20 23:51:40 3994

原创 判断一个数字是否是回文

问题:给一个数字,判断该数字是否是回文。比如 1221是回文,而123不是。分析:判断一个数字是否是回文,我们可以先把它转成字符串,然后根据回文“对称”的特性进行判断:查看第 x 个字符是否与第 n - x + 1 字符是否相等 (x 从1开始,n/2 结束, n 是指数字长度)。但是,这道题因为是数字,有一种更好的解法。即根据原始数字,通过数学方法构建出它的回文数字,如果原始数字大小

2012-07-20 22:27:33 1056

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除