
leetcode算法
文章平均质量分 73
报恩的猫
码农
展开
-
倒排索引
为什么我们要说倒排索引呢? 因为倒排索引是目前 搜索引擎公司最对搜索引擎最常用的存储方式.也是搜索引擎的核心内容!在搜索引擎实际的引用之中,有时需要按照关键字的某些值查找记录,所以我们是按照关键字建立索引,这个索引我们就称之为:倒排索引, 而带有倒排索引的文件我们又称作: 倒排索引文件 也可以叫它为: 倒排文件 来实现快速的检索与高速的效率!那我想问下 什么是倒排表呢?倒排转载 2013-11-26 15:09:26 · 877 阅读 · 0 评论 -
不用中间变量,交换两个数的值
通常我们交换 a,b两个变量的值时,都是通过一个中间变量来实现 temp = a; a = b; b = temp;这里介绍的是不用中间变量,也可以交换两个数的值,具体算法如下:view sourceprint?1void swap(int &a, int &b)2转载 2014-05-23 19:46:14 · 1209 阅读 · 0 评论 -
二叉搜索树 ( 二叉查找树)( 二叉排序树)的定义和遍历
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。转载 2014-09-02 16:03:46 · 5199 阅读 · 1 评论 -
位图法
一、定义 位图法就是bitmap的缩写。所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。在STL中有一个bitset容器,其实就是位图法,引用bitset介绍:A bitset is a special container class that is designed to store bits转载 2014-09-22 22:30:52 · 1111 阅读 · 0 评论 -
最长公共子串(LCS)
最长公共子串(LCS),有三种情况:1.公共子串的元素必须相邻. 2.公共子串的元素可以不相邻联单3. 求多个字符串而不是两个字符串的最长公共子串1.公共子串的元素必须相邻: LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.下面是转载 2014-09-14 18:03:46 · 534 阅读 · 0 评论 -
判断回文
把这个数的倒转数求出来,然后和原数对比就好了。十进制。C/C++ code?1234567891011121314bool isPalindrome(int num){ int pal = 0;转载 2014-09-26 14:36:51 · 512 阅读 · 0 评论 -
把字符串转换成整数
例:‘7’-‘0’就是7这里的是想就是若要将一个数字字符转化成对应的数只需要减去字符‘0’char sNum = ‘7’;int iNum;iNum = sNum - '0' ;转载 2014-09-02 15:46:40 · 421 阅读 · 0 评论 -
hash表的基本操作
hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。 打个比方来说,所有的数据就好像许许多多的书本。如果这些书本是一本一本堆起来的,就好像链表或者线性表一样,整个数据会显转载 2014-09-16 14:50:17 · 683 阅读 · 0 评论 -
hash表的 构造方法 和 解决冲突的方法
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。 对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树转载 2014-09-16 15:22:41 · 6683 阅读 · 1 评论 -
海量数据面试题整理
1、给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件的大小为5G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300M。s转载 2014-09-16 15:39:40 · 438 阅读 · 0 评论 -
位操作全面总结
一. 位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示:符号 描述 运算规则 by MoreWindows& 与两个位都为1时,结果才为1| 或转载 2014-09-03 17:29:56 · 578 阅读 · 0 评论 -
哈希表(散列表)
* 若结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。由此,不需比较便可直接取得所查记录。这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。* 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。* 综上所述,根据散列函数H(k转载 2014-09-03 10:14:49 · 519 阅读 · 0 评论 -
单链表的反转
如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用三个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。 方法1:浪费空间。 方法2:使用p和q连个指针配合工作,使得两个节点间的转载 2014-09-03 14:40:41 · 371 阅读 · 0 评论 -
哈希表对字符串的高效处理
哈希表对字符串的高效处理 哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的方法。 Hash表是使用 O(1)转载 2014-10-05 14:26:07 · 706 阅读 · 0 评论 -
递归和迭代的区别
深究递归和迭代的区别、联系、优缺点及实例对比1.概念区分递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.使用递归要注意的有两点:1)递归就是在过程或转载 2014-10-05 15:10:42 · 692 阅读 · 0 评论 -
字符串匹配的KMP算法
举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Ja转载 2014-10-05 18:21:52 · 339 阅读 · 0 评论 -
图的深度优先遍历
深度优先遍历是连通图的一种遍历策略。其基本思想如下:设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出转载 2014-11-07 21:44:43 · 580 阅读 · 0 评论 -
最长递增子序列 LIS
问题给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5转载 2014-09-28 15:48:10 · 442 阅读 · 0 评论 -
设计一个不能被继承的类
在C#中定义了关键字sealed,被sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,所以我们只有自己来实现。 很多人都能够想到,类的构造函数和析构函数是关键。因为子类的构造函数会自动调用父类的构造函数。子类的析构函数也会自动调用父类的析构函数。所以要想使一个类不能被继承,只有把它的构造函转载 2014-10-07 20:42:01 · 581 阅读 · 0 评论 -
在一个数组中除两个数字只出现1次外,其它数字都出现了2次
微博http://weibo.com/MoreWindows已开通,欢迎关注。本系列文章地址:http://blog.youkuaiyun.com/MoreWindows/article/category/859207首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。 考虑下这个题目的简化版——数组中除一个数字只出现1次转载 2014-10-08 21:24:54 · 1575 阅读 · 0 评论 -
十进制转十六进制
5621转换为16进制数的方法是“除16取余”方法, 5621/16=商351余5,16进制最后一位为5 351/16=商21余15,16进制右边第二位为F 21/16=商1余5,16进制右边第三位为5 1/16=商0余1,16进制数右边第四为为1 商0就不继续除了 最后的结果为15F5[cpp] view plaincopy#inc转载 2014-10-08 20:05:00 · 487 阅读 · 0 评论 -
字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const char *转载 2014-10-08 20:34:26 · 401 阅读 · 0 评论 -
大整数相加
cpp] view plaincopy"code" class="cpp">#include #include #include #include // 思路如下 // 将两个字符串分别由低位到高位放置到int数组中 // 然后每位对齐相加,大于10,本位取余,高位进1 char* bigIntAdd( co转载 2014-10-08 19:49:50 · 362 阅读 · 0 评论 -
大整数相减
[cpp] view plaincopy#include #include #include #include char* bigIntMinus( const char* numstr1, const char* numstr2 ) { assert( numstr1 != NULL && numstr2转载 2014-10-08 19:53:56 · 533 阅读 · 0 评论 -
ip字符串转换为 二进制整数
[cpp] view plaincopy#include #include #include #include using namespace std; // 将ip字符串按照 '.'分割 string* ipSplit(string str) { string* retSTR = new s转载 2014-10-08 19:55:12 · 614 阅读 · 0 评论 -
数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次
本文地址:http://blog.youkuaiyun.com/morewindows/article/details/12684497转载请标明出处,谢谢。欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。 这个题目非常有意思,在转载 2014-10-09 09:59:13 · 4530 阅读 · 0 评论 -
不用加减乘除运算符计算两数之和及a=b*3
《两个常见位操作面试题不用加减乘除运算符计算两数之和及a=b*3》地址:http://blog.youkuaiyun.com/morewindows/article/details/8710737转载请标明出处,谢谢。欢迎关注微博:http://weibo.com/MoreWindows 上一篇《位操作基础篇之位操作全面总结》(http://blog.youkuaiyun.com/more转载 2014-10-09 14:41:54 · 830 阅读 · 0 评论 -
从归并排序到数列的逆序数对
首先来看看原题 微软2010年笔试题在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。 计算数列的逆序数对个数最简单的转载 2014-10-09 16:50:05 · 588 阅读 · 0 评论 -
电梯调度算法总结
1.传统电梯调度算法1.1先来先服务算法(FCFS)先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。它根据乘客请求乘坐电梯的先后次序进行调度。此算法的优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期得不到满足的情况[12]。这种方法转载 2014-11-18 15:26:30 · 10998 阅读 · 2 评论 -
电梯调度算法——编程之美
编程之美------电梯调度算法2011-06-02 15:24一座大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停。实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样的一个办法:由于楼层并不太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的一层。所有乘客都从一楼上电梯,到达某楼层后,电梯转载 2014-11-18 14:20:26 · 3511 阅读 · 0 评论 -
括号匹配
1. 括号匹配的四种可能性:①左右括号配对次序不正确②右括号多于左括号③左括号多于右括号④左右括号匹配正确2. 算法思想:1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配转载 2014-10-17 17:36:41 · 437 阅读 · 0 评论 -
概率p输出1,概率1-p输出0,等概率输出0和1
有个输出0和1的BIASED RANDOM,它以概率p输出1,以概率1-p输出0,以此RANDOM函数为基础,生成另一个RANDOM函数,该函数以1/2的概率输出1,以1/2的概率输出0题目解答:两次调用该RANDOM函数,如果其概率为P(x),调用2次P(1) = p P(0) = 1-pP'(1) =p P'(0) = 1-p概率如转载 2014-10-17 11:02:18 · 12886 阅读 · 9 评论 -
从头到尾彻底理解KMP
从头到尾彻底理解KMP作者:July时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱,如此,留言也是“骂声”一片。所以一直想找机会重新写下KMP,但苦于一转载 2014-10-05 18:42:32 · 354 阅读 · 0 评论 -
哈夫曼树
一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plaincopy转载 2014-11-05 20:49:54 · 521 阅读 · 0 评论 -
冒泡排序
冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1,如果N不为0就重复前面二步,否则排序完成。 按照定义很容易写出代码:[cpp]转载 2014-10-09 16:15:46 · 424 阅读 · 0 评论 -
堆排序
[cpp] view plaincopy// HeapSort.cpp : Defines the entry point for the console application. // #include "stdafx.h" void maxHeapify(int* arr, int len, int index) // 将索引为转载 2014-10-08 18:14:21 · 392 阅读 · 0 评论 -
计数排序
计数排序:前提:知道最大值和最小值计数排序是一种算法复杂度 O(n) 的排序方法,适合于小范围集合的排序。比如100万学生参加高考,我们想对这100万学生的数学成绩(假设分数为0到100)做个排序。我们如何设计一个最高效的排序算法。本文不光给出计数排序算法的传统写法,还将一步步深入讨论算法的优化,直到时间复杂度和空间复杂度最优。先看看计数排序的定义Counting sort (转载 2014-09-03 22:15:08 · 616 阅读 · 0 评论 -
二分查找
转自:http://www.cppblog.com/converse/archive/2009/10/05/97905.html二分查找算法基本思想二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当转载 2014-10-17 17:29:31 · 396 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plaincopy转载 2014-10-09 16:46:34 · 479 阅读 · 0 评论 -
直接选择排序 (异或swap两个数存在陷阱)
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 设数组为a[0…n-1]。1. 初始时,数组全为无序区为a[0..n-1]。令i=02. 在无序区a[i…n-1]中选取一个最小的元素,将其转载 2014-10-09 16:45:44 · 900 阅读 · 0 评论