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

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

原创 自己动手写一个栈

栈是一种后进先出的结构,实现栈有两种方法,链表和数组。用链表的好处在于不用提前声明大小,只在需要的时候创建。而使用数组的好处在于不用指针操作,但是却需要提前声明数组大小。不过通常使用栈的时候,容量都不需要太大,所以使用数组实现也是不错的方法。栈的数组实现比较简单,所以本文只写栈的链表实现。 1)定义链表结点以及相关内容typedef char elemtype; //定义

2012-09-20 20:22:38 4782

原创 最长回文子串

题目描述给定一个字符串,找出该字符串的最长回文子串。回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串。字符串abbacdc存在的回文子串有abba和cdc,因此它的最长回文子串为abba。一个容易犯的错误初看这个问题可能想到这样的方法:对字符串S逆序得到新的字符串S',再求S和S'的最长公共子串,这样求出的就是最长回文子串。如S="caba

2012-09-17 15:36:53 7494 12

原创 链表模拟加法问题

题目描述给定两个链表,每个链表的结点值为数字的各位上的数字,试求出两个链表所表示数字的和,并将结果以链表形式返回。链表的结点定义如下:typedef struct node *pNode;struct node{ int data; struct node *next;};题目有点拗口,请看一个例子:假定两个链表分别为list1和list2,list1各个结点值分别为

2012-09-14 11:36:04 1743 2

原创 自己动手写内存分配函数malloc

一、关于malloc很早就想写这篇文章了,一直拖着没有写,是想写个更完善的版本,不过最近确实没有太多时间去考虑一个很完整的版本,只有先把这个简单的版本写出来了。据说在微软今年招实习生的时候面过这个题目。malloc()是C语言中动态存储管理的一组标准库函数之一,其作用就是从内存的动态存储区(堆)中分配一个长度为size的连续内存空间。参数为一个无符号的整数,返回值则是指向所分配的连续存储空

2012-09-13 21:51:37 8171 1

原创 最大滑动窗口

题目描述给定一个数组A[],有一个大小为w的滑动窗口,该滑动窗口从最左边滑到最后边。在该窗口中你只能看到w个数字,每次只能移动一个位置。我们的目的是找到每个窗口w个数字中的最大值,并将这些最大值存储在数组B中。例如数组A=[1 3 -1 -3 5 3 6 7], 窗口大小w为3。则窗口滑动过程如下所示:Window position Max---

2012-09-11 17:38:03 4674 1

原创 和为N的连续正整数序列

题目输入一个正整数数N,输出所有和为N连续正整数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。一种运用数学规律的解法假定有k个连续的正整数和为N,其中连续序列的第一个数为x,则有x+(x+1)+(x+2)+...+(x+k-1) = N。从而可以求得x = (N - k*(k-1)/2)  /  k。当x的

2012-09-11 15:10:57 4621

转载 浅谈过载保护(转自腾讯大讲堂)

雪球:对于时延敏感的服务,当外部请求超过系统处理能力,如果系统没有做相应保护,可能导致历史累计的超时请求达到一定规模,像雪球一样形成恶性循环。由于系统处理的每个请求都因为超时而无效,系统对外呈现的服务能力为0,且这种情况下不能自动恢复。作者bison,腾讯后台开发技术总监。  过载保护,看似简单,但是要做好并不容易。这里用两个曾经经历的反面案例,给出过载保护的直观展现,并附上一点感想。

2012-09-06 20:08:47 1520

原创 Cassandra数据模型

Cassandra数据模型几个概念Cluster:集群,一个逻辑上的cassandra实例包含的节点。一个集群可以包含多个keyspace。Keyspace:Column Family的名字空间,通常是一个应用一个keyspace。Column Family:包含多个column,每个column包括name,value, timestamp。Column Family通过

2012-09-04 09:00:29 1218

原创 二叉搜索树转换成有序的双向循环链表(一)

题目描述给定一棵二叉排序树(BST),将该树转换成一棵双向循环链表。请看下面的图示说明,你可以更清楚的了解题意。BST的结构定义如下:struct node { int data; struct node* left; struct node* right;};typedef struct node Node;

2012-09-03 22:46:53 3499

原创 二叉树两结点最低公共祖先结点(二)

问题在前面的文章二叉树两结点最低公共祖先结点(一) 中有探讨过这个问题,不过本文考虑的是另外一种二叉树,该二叉树每个结点包含一个指向父结点的指针,根结点的父结点为NULL。其结构如下: struct node { int data; struct node* left; struct node* right;

2012-09-03 17:37:22 2503 2

原创 二叉搜索树两结点最低公共祖先结点

题目给定一棵二叉搜索树(BST),找出树中两个结点的最低公共祖先结点(LCA)。二叉搜索树结点定义: struct node { int data; struct node* left; struct node* right; }; 如下图为一棵BST,结点2和8的LCA是6,结点4和2的LCA是2

2012-09-03 16:29:42 2629 2

原创 二叉树两结点的最低公共祖先结点(一)

题目二叉树结点的定义如下:struct node { int data; struct node* left; struct node* right;};给定二叉树中的两个结点,输出这两个结点的最低公共祖先结点(LCA)。注意,该二叉树不一定是二叉搜索树。比如给定的二叉树如下所示,则可以知道结点1和5的最低公共祖先结点为5,结点4和5的最低公共祖先

2012-09-02 23:01:42 11465 4

原创 寻找第K小的数

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

2012-08-31 17:15:08 12091

原创 自己动手写二叉堆

一、二叉堆概念二叉堆一种数组对象,可以被视为一棵完全二叉树,树中每个结点和数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层除外。表示堆的数组有两个属性对象,其中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 2126

原创 自己动手写快速排序

自己动手写快速排序快速排序算法不算复杂的算法,但是实际写代码的时候却是最容易出错的代码,写的不对就容易死循环或者划分错误。所以还是自己动手多写会印象深刻点。一、初探—朴素的快速排序算法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 1899

原创 随机算法全面总结

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

2012-08-29 16:21:27 17160

转载 复杂链表的复制

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

2012-08-28 20:23:36 1167

原创 组合算法面试题

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

2012-08-28 17:32:27 5585

原创 递归面试题汇总

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

2012-08-27 21:30:31 9112 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 1934

原创 背包问题汇总

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

2012-08-26 15:38:54 3441

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

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

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

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

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

2012-08-24 20:17:12 3160

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

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

2012-08-24 19:29:30 9878

转载 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 2097

转载 也谈走台阶问题

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

2012-08-22 10:59:33 1174

转载 最大公约数(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 1456

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

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

2012-08-19 22:18:53 1065

原创 链表合并算法

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

2012-08-19 20:26:11 2162

原创 二分查找之谜题

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

2012-08-19 16:19:04 1350

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

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

2012-08-17 21:43:37 3816

原创 链表相交问题

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

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

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

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

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

原创 字符串函数汇总

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

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

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

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

2012-08-15 08:51:48 3239

原创 整数分解使得积最大

题目:给一个数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 2408

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

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

2012-08-14 11:41:10 1111

原创 素数算法

题目:写一个程序,找出前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 2351

原创 腾讯的一道面试题—不用除法求数字乘积

题目:已知一个包含N个元素的数组A[N],试求出这样一个数组OUTPUT[N],其中OUTPUT[I]的值为数组A中除了A[i]的其他所有元素的乘积。注意,不能使用除法。时间复杂度必须为O(N)。例如OUTPUT[0]的值为A[1]*A[2]...A[N], OUTPUT[1]的值为A[0]*A[2]...A[N]。假定数组A={4, 3, 2, 1, 2},则OUTPUT={12,

2012-07-31 21:26:38 4016 3

原创 经典shell面试题整理

一、取出/etc/passwd文件中shell出现的次数问题:下面是一个/etc/passwd文件的部分内容。题目要求取出shell并统计次数,shell是指后面的/bin/bash,/sbin/nologin等,如下面/bin/bash出现12次,/sbin/nologin出现3次。hyn:x:525:500::/home/hyn:/bin/bashljlxx:x:526:500::/

2012-07-31 16:03:21 12771 5

空空如也

空空如也

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

TA关注的人

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