自定义博客皮肤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

为天地立心,为生民立命,为往圣继绝学,为万世开太平

  • 博客(143)
  • 资源 (1)
  • 收藏
  • 关注

原创 从数列1, 2, 3, ... , n 中 随意取几个数,使其和等于sum. [No. 24]

问题:输入两个整数 n 和 sum,从数列1, 2, 3, ... , n 中 随意取几个数,使其和等于 sum,要求将其中所有的可能组合列出来.比如n = 5, sum  = 8, 那么所有的组合为:3  5 或者 1  5  2 或者 1  4  3思路:对于一个给定的总和sum, 如果我们从数列的尾部开始,即从n开始,sum 要么等于 n 加上 剩余的1到 n -

2011-12-28 07:48:10 4811 2

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

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

2011-12-27 13:25:54 3891

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

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

2011-12-23 04:31:40 17255 9

转载 左旋转字符串

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的

2011-12-21 09:20:16 1383

原创 编辑距离 (edit distance)

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

2011-12-16 00:42:05 1562

原创 检查一个数组是否可能是一棵二叉查询树后序遍历的结果 [No. 6]

问题:给一个数组,检查它是否可能是一棵二叉查询树后序遍历的结果。换句话说,是否存在一棵二叉查询树,对它进行后序遍历后,得到的数组和给定的数组完全一样。比如,对上面这个二叉查询树后序遍历后,得到的数组是:[1, 4, 7, 6, 3, 13, 14, 10, 8]。思路:因为二叉树后序遍历的时候,先左后右然后中间。所以,数组的最后一个一定是整个二叉查询树的根(比如 8),而且

2011-12-14 13:39:39 1444

原创 八皇后问题 [No. 59]

问题:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。请求出总共有多少种摆法。下图为一种为符合条件的摆放。思路:因为棋盘的长宽和皇后的个数是一样的,那么,每一个皇后总是占据其中的一列(或者一行,我们这里假设皇后占据的是列,所以,第i个皇后总是在第i列上)。但是每一个皇后在行上面有很多种不同的位置,如果我们用一个数组ro

2011-12-14 06:52:03 1345 2

原创 打印二叉树所有的路径 [No. 9]

问题:给一个二叉树,把所有的路径都打印出来。比如,对于下面这个二叉树,它所有的路径为:8 -> 3 -> 18 -> 2 -> 6 -> 48 -> 3 -> 6 -> 78 -> 10 -> 14 -> 13思路:从根节点开始,把自己的值放在一个数组里,然后把这个数组传给它的子节点,子节点同样把自己的值放在这个数组里,又传给自己的子节点,直到这个节点是叶节点,

2011-12-11 03:39:20 4717 1

原创 判断一个树是不是二叉查询树 (ISBST)

问题:给定一个二叉树,判断它是否是二叉查询树。思路:要判断是否是二叉查询树,标准就是看每一个节点是否满足:1、左节点及以下节点的值比它小;2、右节点及以下节点的值比它大。当然,前提是子节点都存在的情况。所以,我们需要从根节点不断向下递归,只要所有节点都满足,那么就是BST,否则,就不是。代码:private boolean isBST(Node node) {

2011-12-10 14:52:28 2705

原创 最近公共祖先 (LCA) [No. 21]

问题:给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA)。比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8。我们这里先考虑一般的二叉树(BT),然后再考虑这个二叉树是二叉搜索树(BST)的情况。查找两个node的最早的公共祖先,分三种情况:1. 如果两个node在root的两边,那么最早的公共祖先就是root。2.

2011-12-10 01:57:50 2856

原创 最大子矩阵和

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

2011-12-09 13:32:56 31842 23

转载 顺时针打印矩阵 (JAVA实现)

这是一篇我见过的讲得最清楚,考虑情况最多的文章。所以转载过来,我已经用java实现,而原文章用的是C++实现。题目:给定一个矩阵,从外向内顺时针打印矩阵中的每一个数字。例如:给定矩阵:1    2    3    45    6    7    89    10   11  1213   14   15  16输出应该为:{1,2,3,4,8

2011-12-09 01:40:01 2783

原创 字符串排列和组合的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 12203 4

原创 两两反转单向链表 (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 2653 3

原创 格雷码的实现

问题:产生n位元的所有格雷码。格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。如果要产生n位元的格雷码,那么格雷码的个数为2^n.假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的

2011-12-06 08:19:29 45317 3

原创 反转单向链表(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 9259

原创 LRU缓存介绍与实现 (Java)

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

2011-11-26 06:51:37 53282 9

原创 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);

2011-11-24 05:18:42 2057

原创 java实现字符串反转

问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路:先把字符串从第一个字符与最后一个字符对换,第二个字符和倒数第二个字符对换,这样,我们就把每一个单词位置互换了。但是我们要求单词里面字符的顺序是不能变的,所以,我们要把每一个单词里面的字符从头到尾对换一下。这样就可以得到我们想要的字符串了。实现:因为这里两次都会用到字符反

2011-11-24 03:26:55 16258

原创 Java实现atoi函数 [#47]

问题:把一个字符串转成一个整数。思路:其实,这道题考的不是怎么去把一个数转成一个整数,而是考你是否能够把所有的情况都考虑完全,我们应该考虑的因素如下:1. 这个字符串是否是空的。2. 这个字符串是否有非法字符(非0-9之间的字符)。3.这个数是正数或者是负数的情况(第一个字符是否为+,-)。4. 是否存在溢出的情况(这个比较难考虑到)。public static

2011-11-22 13:46:08 5592

原创 一个已经排序的数组,去除里面重复的元素

问题:对于一个已经排好序的数组,去除里面重复的元素,比如A = {1,2,2,2,3,3,4,4}, 去掉重复以后,就变成A = {1,2,3,4}.原理非常简单,关键是写代码的时候注意“指针”位置,和如何比较重复,参见代码里的第一个for循环。public int[] uniqueArray(int[] array) { if (array.length == 0) retu

2011-11-21 11:57:31 8853 4

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

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

2011-11-21 05:40:31 7260 1

原创 找出两个已经排好序的数组的中位数

问题:给两个已经排好序的数组,一个长度为 m (m >= 1), 一个长度为 n (n >= 1),找出这两个数组的中位数。时间复杂度要求为 O(m+n), 空间复杂度为 O(1)。其实这个问题本身来讲是不难的,关键的关键,是对一些边界条件的处理。思路:我们首先不管两个数组里含有多少个数字,而是先得到第 (m+n+1)/2个数字的值。 如果 m + n为奇数,我们返回第 (m+n+

2011-11-20 13:03:19 4981

原创 Trie的java实现

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

2011-11-17 14:01:05 9809 1

原创 Java实现最长公共子序列 [No. 73]

最长公共子序列(LCS)定义:一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。比如数列A = “abcdef”, B = “adefcb”. 那么两个数列的公共子序列是"adef". 最长公共子序列和最长公共子字符串是有区别的,公共子序列里的元素可以不相邻,但是公共子字符串必须是连接在一起的。比如A和B的公共子字符串

2011-11-17 12:07:16 12340 2

原创 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 1527 1

转载 不用+、-、×、÷数字运算符做加法

题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性。首先我们可以分析人们是如何做十进制的加法的,比如是如何

2011-11-11 07:02:55 1148

转载 找出数组中两个只出现一次的数字 [No. 30]

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的

2011-11-11 05:50:32 3579

转载 在O(1)平均时间删除链表结点 [# 13]

题目:给定链表的头指针和一个结点指针,在O(1)平均时间删除该结点。链表结点的定义如下:struct ListNode{      int        m_nKey;      ListNode*  m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeD

2011-11-11 05:15:48 952

原创 rand5()构造rand7()

给一个方法,比如 rand5(), 它能够等概率生成 1-5 之间的整数。 所谓等概率就是1,2,3,4,5 生产的概率均为 0.2 。现在利用rand5(), 构造一个能够等概率生成 1- 7 的方法。这里有两个特别重要的点,一是 如果 rand5() + rand5(), 我们能够产生一个均匀分布的 1 - 10 吗? 答案是否定的。比如对于 6来讲(4+2, 2+4, 3+3),它被生成

2011-11-09 11:40:31 1978

原创 两个巨大正整数相加

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

2011-11-09 01:08:59 1545

转载 Semaphore 和 Mutex 的区别 [No. 32]

Mutex:Is a key to a toilet. One person can have the key - occupy the toilet - at the time. When finished, the person gives (frees) the key to the next person in the queue.Officially: "Mutexes

2011-11-05 00:04:46 804

转载 找出丢失的数字

有一组数字,从1到n中减少了一个数,顺序也被打乱了,放在一个n-1的数组里,请找出丢失的数字。1、用1+2+...+n(即n(n+1)/2)减去当前输入数据的总和。时间复杂度为O(n),空间复杂度O(1),缺点是容易溢出。缓解溢出的方法,求1+2+...+n的时候,边加边减。假如数组为a,那么这可以这么计算1-a[0]+2-a[1]+...+(n-1)-a[n-2]+n。2、用1*

2011-11-04 07:02:46 3393

转载 海量数据处理专题(二)——Bloom Filter

本文转自: http://blog.redfox66.com/post/2010/09/24/mass-data-topic-2-bloom-filter.aspx【什么是Bloom Filter】Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一

2011-11-04 05:55:22 721

转载 Java 数据存储方式

在Java中到底是如何去保存数据的呢?下面我就以int数据类型为例说明Java 数据存储方式。大家都知道在Java 数据存储方式。定1 int = 4 byte, 1 byte = 8 bit。以此推理那么1个int在计算机中就是以4 * 8 = 32位(bit)的方式存储的。而又由于java中的int是属于有符号类型(Java中不存在unsigned类型),所以32位的高一位是符号位,由

2011-11-04 05:21:39 4296

转载 Bit-map

本文转自:http://blog.redfox66.com/post/2010/09/26/mass-data-4-bitmap.aspx【什么是Bit-map】所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。如果说了这么多还没明白什么是Bit-map

2011-11-04 05:11:47 698

转载 十七道海量数据处理面试题与Bit-map详解

十七道海量数据处理面试题与Bit-map详解作者:小桥流水,redfox66,July。前言    本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。    同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文

2011-10-30 13:32:05 1135

转载 十道海量数据处理面试题与十个方法大总结

第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。      首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几

2011-10-30 13:23:11 797

转载 Top K 算法详解

百度面试题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。问题解析:要统计最热门查询,首先就是要

2011-10-30 12:08:38 1941

转载 JAVA 基本数据类型长度

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。 1、整数:包括int,short,byte,long 2、浮点型:float,double 3、字符:char 4、布尔:boolean基本型别大小最小值最大值boolean----------

2011-10-30 11:37:43 2572

算法设计与分析 王晓东

算法设计与分析 作者:王晓东 清华大学出版社出版

2010-04-10

空空如也

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

TA关注的人

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