自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

__七把刀__

新的文章请移步简书查看 http://www.jianshu.com/u/4d4a2f26740b

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

原创 寻找第K小的数

前言寻找第K小的数属于顺序统计学范畴,通常我们可以直接在O(NlgN)的时间内找到第K小的数,使用归并排序或者堆排序对输入数据按从小到大进行排序,然后选择第K个即可。然而,我们还有更好的算法。一、热身—最大值和最小值首先来看一个简单的问题,在一个有n个元素的集合中,需要多少次比较才能确定其最小值呢?这可以很容易退出需要n-1次这个上界。伪代码如下所示:MINIMUM(A

2012-08-31 17:15:08 12290

原创 自己动手写二叉堆

一、二叉堆概念二叉堆一种数组对象,可以被视为一棵完全二叉树,树中每个结点和数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层除外。表示堆的数组有两个属性对象,其中length[A]表示数组A中的元素个数,而heap-size[A]则表示存放在A中的堆的元素个数。heap-size[A]int parent(int i) { return i/2; }int l

2012-08-30 22:54:04 2156

原创 自己动手写快速排序

自己动手写快速排序快速排序算法不算复杂的算法,但是实际写代码的时候却是最容易出错的代码,写的不对就容易死循环或者划分错误。所以还是自己动手多写会印象深刻点。一、初探—朴素的快速排序算法void quick_sort(int a[], int l, int u){ if (l >= u) return; int m = l; for (int i=l

2012-08-29 22:32:00 1947

原创 随机算法全面总结

随机算法涉及大量概率论知识,有时候难得去仔细看推导过程,当然能够完全了解推导的过程自然是有好处的,如果不了解推导过程,至少记住结论也是必要的。本文总结最常见的一些随机算法的题目,也当作面试的准备工作吧。需要说明的是,这里用到的随机函数都假定它能随机的产生范围[a,b]内的整数,即产生每个整数的概率相等。(虽然在实际中并不一定能实现,不过,谁在乎呢?这个世界都是这么随机)一、随机排列数组

2012-08-29 16:21:27 17303

转载 复杂链表的复制

原文地址:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:               struct ComplexNode{

2012-08-28 20:23:36 1183

原创 组合算法面试题

组合算法题往往有多个变种,如求一个集合的全部子集以及部分组合问题,这篇文章对这些常见的面试题做个汇总,权当做个记录,以免自己哪天忘了,难得到网路上去找。一、求一个集合的全部子集题目:给定一个集合s={a, b, c, d},试给出一个算法输出该集合的除了空集之外的全部子集。分析:我们知道,一个集合的子集数目跟它的元素数目有关,集合元素数目为n,则子集数目为2^n。如包含两个元素的集合s

2012-08-28 17:32:27 5649

原创 递归面试题汇总

一、前言找工作面试时最喜欢问的是算法题,虽然我觉得有些取巧的算法题只是跟刷题量有关。但是为了找工作不得不加强算法,特别是基础算法,这是一个人基本功的体现。《算法导论》是不错的教材,不过大部头看起来确实需要发时间,到现在还只是大略看了一遍,很多推导过程没细心看下来,深以为憾,以后有时间还是要猛补。算法题中最能体现算法精髓的则非递归莫属了,我对递归一直总觉得是一知半解,为了加深自己的理

2012-08-27 21:30:31 9187 5

转载 数学之美—快排为什么那样快

本文转载自刘未鹏的博客,写的太好了,学习ing。特别是称球问题的描述,让人耳目一新。原文地址:http://mindhacks.cn/2008/06/13/why-is-quicksort-so-quick/目录0. 前言1. 猜数字2. 称球3. 排序    3.1 为什么堆排比快排慢    3.2 为什么快排其实也不是

2012-08-27 15:47:23 1949

原创 背包问题汇总

本文主要来源于《背包问题九讲》,我主要选择了比较简单的0-1背包问题和完全背包问题进行汇总,并加入了python代码实现,刚重装系统,手头没有C编译器,汗。一、背包问题概述        背包问题包括0-1背包问题、完全背包问题、部分背包问题等多种变种。其中,最简单的是部分背包问题,它可以采用贪心法来解决,而其他几种背包问题往往需要动态规划来求解。本文对几种背包问题进行总结,同时给

2012-08-26 15:38:54 3472

转载 JAVA NIO总结(四)—网络和异步IO

9、连网和异步 I/O概述连网是学习异步 I/O 的很好基础,而异步 I/O 对于在 Java 语言中执行任何输入/输出过程的人来说,无疑都是必须具备的知识。NIO 中的连网与 NIO 中的其他任何操作没有什么不同 ― 它依赖通道和缓冲区,而您通常使用 InputStream 和 OutputStream 来获得通道。本节首先介绍异步 I/O 的基础 ― 它是什么以及它不是

2012-08-24 20:25:29 4308 5

转载 JAVA NIO总结(三)—分散聚集、文件锁定、字符集

6、分散和聚集概述分散/聚集 I/O 是使用多个而不是单个缓冲区来保存数据的读写方法。一个分散的读取就像一个常规通道读取,只不过它是将数据读到一个缓冲区数组中而不是读到单个缓冲区中。同样地,一个聚集写入是向缓冲区数组而不是向单个缓冲区写入数据。分散/聚集 I/O 对于将数据流划分为单独的部分很有用,这有助于实现复杂的数据格式。分散/聚集IO

2012-08-24 20:17:12 3179

转载 JAVA NIO总结(二)—缓冲区原理

4、缓冲区的内部细节概述本节将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor)。状态变量是前一节中提到的"内部统计机制"的关键。每一个读/写操作都会改变缓冲区的状态。通过记录和跟踪这些变化,缓冲区就可能够内部地管理自己的资源。在从通道读取数据时,数据被放入到缓冲区。在有些情况下,可以将这个缓冲区直接写入另一个通道,但是在一般情况下,您还需要

2012-08-24 19:29:30 9901

转载 JAVA NIO总结(一)—基本概念

本系列文章只是对JAVA NIO的知识做一个汇总,所有内容都来自网络,原文地址http://www.ibm.com/developerworks/cn/education/java/j-nio/index.html。1、输入/输出:概念性描述1.1) I/O简介I/O  或者输入/输出指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统

2012-08-24 17:26:20 2115

转载 也谈走台阶问题

问题刚才在首页看到一篇博客,说的是腾讯的一道面试题:一个楼梯有50个台阶,每一步可以走一个台阶,也可以走两个台阶,请问走完这个楼梯共有多少种方法?博主把这题分析的很麻烦。引来很多人围观。我以前也碰到过这个问题。写出来和大家分享一下。举个例子,假设有3个台阶,则有三种走法:分别是,1-1-1, 1-2, 2-1。分析很简单的一道题,学过组合数学的人很快就能想到,这是一个递推关

2012-08-22 10:59:33 1183

转载 最大公约数(Gcd)两种算法(Euclid && Stein)

转载自:http://www.cnblogs.com/drizzlecrj/archive/2007/09/14/892340.html很老的东东了,其实也没啥好整理的,网上很多资料了,就当备用把:-)1. 欧几里德算法和扩展欧几里德算法欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) =

2012-08-20 10:30:50 1480

原创 排序算法大杂烩(一)——基础排序

一、前言排序算法也是面试中常常提及的内容,问的最多的应该是快速排序、堆排序。这些排序算法很基础,但是如果平时不怎么写代码的话,面试的时候总会出现各种bug。虽然思想都知道,但是就是写不出来。本文打算对各种排序算法进行一个汇总,像插入排序、冒泡排序、选择排序等就简单的介绍,重点关注快速排序和堆排序。需要提到的一点就是:插入排序,冒泡排序,归并排序,计数排序都是稳定的排序,而其他排序则都是不稳定的

2012-08-19 22:18:53 1094

原创 链表合并算法

题目已知两个有序链表,试合并这两个链表,使得合并后的链表仍然有序(注:这两个链表没有公共结点,即不交叉)。分析既然两个链表都是有序的,所以合并它们跟合并两个有序数组没有多少区别,只是链表操作涉及到指针,不能大意。方法一:非递归方法使用2个指针list1和list2分别遍历两个链表,将较小值结点归并到结果链表中。如果有一个链表归并结束后另一个链表还有结点,则把另一个链表剩

2012-08-19 20:26:11 2192

原创 二分查找之谜题

一、前言二分查找本身是个简单的算法,但是正是因为其简单,更容易写错。甚至于在二分查找算法刚出现的时候,也是存在bug的(溢出的bug),这个bug直到几十年后才修复(见《编程珠玑》)。本文打算对二分查找算法进行总结,并对由二分查找引申出来的问题进行分析和汇总。若有错误,请不吝赐教。二、二分查找是这样的相信大家都知道二分查找的基本算法,如下所示,这就是二分查找算法:int b

2012-08-19 16:19:04 1382

原创 有序的循环链表中插入结点

题目给定一个有序的循环链表,在其中插入一个值,保持该循环链表依然有序。分析首先看下循环链表的结构,如下图所示为一个循环链表,其尾结点指向头结点,从而形成一个循环。给定的链表结点可以是链表任意一个结点,这个结点不一定是链表头结点,从而这也增加了该题的难度。此时若是要在链表中插入4,则插入后的链表如下所示:可以看到插入4后,链表依然有序。在解决这个问题前,先来看一个

2012-08-17 21:43:37 3868

原创 链表相交问题

题目:给定两个单向链表的头结点指针,比如为h1和h2,判断这两个链表是否相交。分析:一、先来分析链表不存在环的情况。编程之美和JULY的博文闲话链表追赶问题上对该题都有详述,拿来用了。1.直接循环判断第一个链表的每个节点是否在第二个链表中。但,这种方法的时间复杂度为O(Length(h1) * Length(h2))。显然,我们得找到一种更为有效的方法,至少不能

2012-08-17 20:09:13 1352 3

原创 输出链表倒数第K个结点

题目描述:输入一个单向链表,输出该链表中倒数第k个结点。分析:方法1:要输出链表中的倒数第K个结点,最自然的想法是先求出链表的长度N,然后从头遍历链表输出链表的第N-K+1个结点即可。注意本题数字从1计数,也就是说倒数第1个节点是链表最后一个结点。例如链表长度为4,需要输出倒数第2个结点,则我们只需要从头开始输出链表第3个结点即可。该思路代码如下:struct node

2012-08-17 15:26:43 4793 10

原创 字符串函数汇总

面试中常常会要求写一些基本的库函数,尤其以字符串库函数考的最多,所以本文汇总了一些常见的字符串库函数的实现。此外,把与内存相关的操作函数也汇总到了一起。//求字符串长度int strlen(const char *s) { int n = 0; while (*s++ != '\0') n++; return n;}//字符串拷贝,返回指针是为了实现链式操

2012-08-15 10:56:19 1401 1

原创 将有序单链表转换为平衡的二叉搜索树

题目:给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。分析:单链表的结点结构如下。struct node { int data; struct node *next;};由于单链表升序排列,可以参照前面的文章将有序数组转换为平衡二叉搜索树, 先求的链表中的结点的值保存在数组中,然后采用相同的方法实现,时间复杂度为O(N)。当然也可以不额

2012-08-15 08:51:48 3286

原创 整数分解使得积最大

题目:给一个数n,你可以将这个数拆成任意个整数之和。找出在所有的拆分方式中,拆出来的所有的数的积的最大值(也包括只拆成一个数,如2拆成2最大)。如 n = 6, 可以拆成  3 * 3 = 9            2 * 4 = 82 * 2 * 2 = 8        1 * 1 * 4 = 41 * 1 * 2 * 2 = 4    ...最大值为9。分

2012-08-14 19:16:25 2457

转载 java多线程环境单例模式实现详解

Abstract         在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制,也就是说只有当使用到这个实例的时候才会创建这个实例,这个好处在单例模式中得到了广泛应用。这个机制在single-threaded环境下的实现非常简单,然而在multi-threaded环境下却存在隐患。本文重点介绍惰性加载机制以及其在多线程环境下的使用方法。(作者number

2012-08-14 11:41:10 1129

原创 素数算法

题目:写一个程序,找出前N个素数。比如N为100,则找出前100个素数。分析最基本的想法就是对1到N得每个数进行判断,如果是素数则输出。一种改进的方法是不需要对1到N所有的数都进行判断,因为偶数肯定不是素数,而奇数可能是素数,可能不是。2,3,5都是素数,这可以直接得到。然后我们可以跳过2与3的倍数,即对于6n,6n+1, 6n+2, 6n+3, 6n+4, 6n+5,我们只需

2012-08-13 15:15:20 2397

空空如也

空空如也

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

TA关注的人

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