- 博客(30)
- 收藏
- 关注
原创 Java注解成员支持的类型
在Java中,注解的成员类型是有限的,例如下面的示例:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Target { /** * Returns an array of the kinds of elements an an
2017-01-03 10:20:18 4159
原创 妹纸小A的计数工作
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2017-01-03 09:41:09 2229
转载 TCP状态转换图
+---------+ ---------\ active OPEN | CLOSED | \ ----------- +---------+<---------\ \ create TCB
2013-09-19 23:25:06 631
原创 填充Z形二维数组
形如 1 3410 2 5911 6 81215 7131416的数组称谓Z形二维数组。填充这样的数组其实只要按照Z形进行行走填充即可,设置一个flag指示方向,行走的时候检测边界,遇到边界便转换方向。const int N = 16;void fill_z_ar
2013-09-16 23:14:39 1334
原创 非递归实现快速排序
非递归实现快速排序的方法和递归类似,其实所有的递归程序都能写成非递归的形式,只要将隐式的栈改成显示的栈即可。void swap(int &in1, int &in2){ int tmp = in1; in1 = in2; in2 = tmp;}int qsort_partition(int A[], int q, int r){ int i, j, k = A[r];
2013-09-15 09:37:29 1020
原创 寻找发帖“水王”
在编程之美中有《寻找发帖“水王”》这么一题,这题书上提供了一个比较好的解法。对于某个元素超过总数N的1/M这类问题有一个通用的方法来解决。试看这样的操作:每次取出M个不同的元素,然后求解余下元素中超过总数1/M的元素。最终将能剩下M-1个元素,超过总数的1/M的元素肯定在其中,计算一下这些元素的数量即可得到解。总的时间复杂度最少能达到O(NMlogM),下面代码实现了这个思路。#include
2013-09-05 12:20:56 1086
原创 连连看游戏中的最短路径
连连看游戏是一个比较简单的游戏,两个相同的点可以消除,但前提是两点之间的路径不能有多于两个折点。如何去求解两个点之间的距离呢?我们可以将这里的距离定义为二元组(x,y),x表示多少次转折,y表示路径长度。x值越小距离越短,相同x值的情况下y值越小距离越短。这样下面就容易写代码了。#include #include using namespace std;const int N = 20
2013-09-04 23:03:02 1912
原创 快速排序
快速排序的python实现。# -*- coding:utf-8 -*-'''qsort'''def qsort_partition(A,p,r): x = A[r] i = p - 1 for j in range(p,r): if A[j] < x: i += 1 A[j],A[i] = A[
2013-09-01 22:37:50 493
原创 和为指定值的连续序列
输入一个整数s,打印出所有和为s的连续正整数序列(至少包含两个数)。例如,对于输入15,由于有1+2+3+4+5=15,4+5+6=15,7+8=15,所以打印出1~5、4~6、7~8三个序列。有个比较好的做法是利用等差数列求和公式:s=a*n+n*(n-1)/2。这里的a是第一个元素,n是项数。int solve(int k){ int count = 0; for (
2013-08-31 00:06:19 1040
原创 邻接表表示图
邻接表表示图是一种标准的做法,简单的做法是使用邻接矩阵,如下面的代码所示。#include #include #include #include #include using namespace std;struct edge { int value; size_t id; struct edge *next;};struct vertex { string nam
2013-08-10 20:06:55 702
原创 图的拓扑排序
无环有向图可以进行拓扑排序,形象一点说就是,很多件有依赖关系的工作,怎么安排才能一步步进行下去。拓扑排序的思想很简单,使用邻接表存储图的话,拓扑排序在O(|V|+|E|)的时间内可以完成。下面介绍两种拓扑排序方法。1、简单的拓扑排序首先,找出所有入度为0的节点,放入一个队列,然后,取出一个入度为零的节点,删除该节点以及该节点与其它节点的边,将新产生的入度为0的节点加入队列,最后当队列为
2013-08-08 23:29:28 828
原创 重建二叉树
二叉树有前序、中序、后序三种遍历方法,如果知道了其中两种的遍历结果,是不是就可以重建原来的二叉树呢?当然这里是有前提的,二叉树的节点不能有相同的,不然有可能无法还原!已知前序和中序前序遍历结果的第一个元素是原二叉树的根,接下来的是左子树和右子树的前序遍历结果。中序遍历结果中根左边的是左子树的中序遍历结果,右边的是右子树的中序遍历结果!我们可以将问题转换为两个子问题,采用递归的方法很容易求解
2013-08-08 23:26:26 633
原创 函数调用约定
在VC中,调用方式有__stdcall,__cdecl,__fastcall,thiscall几种。其中前三种是一般调用所能使用的调用方式,thiscall是类对象调用成员函数时使用的调用方式,当在一个函数前使用__declspec(naked)修饰时,编译器不会在函数的内部将不再产生保存和恢复某些寄存器值的代码。__stdcall对于__stdcall调用方式,所有参数通过栈传递,参数压
2013-08-08 23:24:05 667
原创 变参函数剖析
变参函数定义形式如func(type a, …),要求至少一个固定参数,因为需要通过这个参数来确定究竟有多少个参数、以及参数的类型。windows中,变参函数用来获取参数的几个宏定义如下。typedef char * va_list;#define _ADDRESSOF(v) (&(v))#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)
2013-08-08 23:18:23 645
原创 二叉树中节点的最大距离
二叉树也是一个图,虽然在一般的图中求解简单最长路径问题非常困难,但是在二叉树中却比较简单!我们甚至可以在线性时间内解决问题!二叉树中距离最长的两个节点一定是叶子节点或根节点,假设有一个节点不是叶子节点或根节点,那么其父亲或者其儿子到另外一个节点的距离比最大距离要大,所以假设错误。如果距离最长的两个节点有一个是根,那么最长距离就等于树的高,而且根只有一个儿子,否则一定存在更长的距离。对于某一个节
2013-08-08 23:15:38 810
原创 单链表节点删除问题
单链表的节点删除一种保守的做法是从头遍历一遍,然后找到要删除节点的前一个节点,修改next指针,最后释放delete节点。实际上有些情况下可以在O(1)的时间内删除节点!如果节点指针被引用,那么删除单链表的节点就只能遍历一遍来删除了,否则我们完全可以优化删除算法!设要删除的节点为p,当节点需要维持相对顺序时,将节点p->next的值拷贝到节点p,然后删除节点p->next,如果节点p位于末尾,
2013-08-08 23:12:07 1104
原创 N!的末尾有多少个0?
N的阶乘末尾有多少0呢?首先,得思考一下0到底是由哪些数贡献的,显而易见,一个2和5能贡献一个0,然后我们只需要计算2和5的因子的个数即可,最后取最小值就是0的个数!N的阶乘是从1到N的乘积,因子2的个数明显多于5,只需要计算因子5的数量即可。1-N中5的倍数有N/5个,5²的倍数有N/5²个,5³的倍数有N/5³个,……,等等。因此易于求得因子5的个数,见代码6-11行。计算N的阶乘因子
2013-08-08 23:10:42 748
原创 按层遍历二叉树
按层遍历二叉树是广度优先的算法,这个算法需要一个队列,最开始将根节点入队,然后处理队列,直到队列为空,这样就处理完了整棵树。好吧,看起来广度优先遍历是这么的简单,与深度优先不同,广度优先使用队列,见下面的代码。处理一个节点时,如果该节点有左儿子将左儿子入队,如果有右儿子将右儿子入队,这样就会按距离遍历完所有的节点。#include #include #include using na
2013-08-08 23:09:34 727
原创 输出单链表的倒数第K个节点
求解单链表第K个节点或者倒数第K个节点总是一个O(n)的问题!一般的求解倒数第K个问题是转换为求解第N-K个节点的问题,这样需要求出链表总长N,实际上可以做的更好!求解倒数第K个节点更好的一种做法是不求解链表长度,使用一个指针指向第K个节点,另一个指针指向第一个节点,两个指针同步移动,当第一个指针移动到末尾,第二个指针就指向倒数第K个节点!#include using namespace
2013-08-08 23:08:50 704
原创 就地翻转单链表
翻转单链表是比较简单的事情,就像双向链表插入节点一样,关键在于指针的处理,除此之外没有什么值得关注的!#include using namespace std;struct list { int value; struct list *next;};struct list *insert(struct list *head, int v){ if (head) { he
2013-08-08 23:07:08 655
原创 常量时间的队列操作(min/max)
要想实现带有min,max常量时间操作的队列,不能直接通过增加额外的空间来实现,但是可以通过使用带有min,max常量时间操作的两个栈来实现!栈1用于接受加入队列的数据,push操作时总是会把数据压入栈1,pop时总是弹出栈2,如果栈2为空是就将栈1的数据依次弹出压入栈2!这样便使用两个栈实现了一个队列,由于栈有常量时间的min,max操作,队列也拥有了常量时间的min,max操作。#in
2013-08-08 23:06:10 710
原创 阿拉伯数字转换为中文数字
有次在百度的面试中遇到了这个问题,当时做的比较挫,现在仔细想了一下然后写了这样的一段代码。我是按照人对数字的分析来写的这段代码。首先,如果在数字中有小数部分,那么直接从末尾开始将小数部分的每一位转换为中文,即代码20-28行所示,最后需要增加一个“点”字。然后,从小数点左边的低位到高位四位四位地进行转换,如代码34-51行所示。flag是0位数的计数,如果当前四位全是0那么不需要每四位的单位,
2013-08-08 23:04:18 1092
原创 数独求解
数独是一个很经典的问题,由于数独的规模很小,暴力破解数独也是一个很不错的方法!我就是采用暴力破解的办法去寻找数独的解,在求解的过程中按照人类的思维大大减少了搜索路径的数量!我设置了一个标记,flag用于标记某一行、某一列以及某一块是否已经有了某个数,见代码31-33行,每次向空格里填一个数,然后添加标记,接下来的搜索中在冲突区域就不会再使用这个数了。这种方法避免了每次填完所有空再检验!#i
2013-08-08 23:02:55 791
原创 找出二叉树中和为某值的所有路径
问题是这样的,在一棵以root为根的树中,找出以root为起点的所有路径,要求路径中节点的值相加等于给定的数值。这个问题很简单,甚至于相都不用想就知道遍历树一遍就可以解决。找出符合要求的路径,其实就是下面这个递归表达式:1.求出以root为节点和等于v的路径;2.如果root->value等于v,那么找到一条路径,返回;3.如果root->value大于v,那么就分别找出以root
2013-08-08 23:01:24 711
原创 单链表有环求长度及相交问题
单链表的节点只有一个指针指向下一个节点,两个单链表相交的话就会导致两个单链表的尾节点是相同的,所以只需要比较尾节点是否相同就可以知道两个单链表是否相交。但是,这样是否就完全没有问题了呢?
2013-08-08 22:59:12 921
原创 几个字符串匹配算法
字符串匹配算法是一种应用很广泛的算法,在入侵检测、关键词匹配等技术中都需要使用到。我专门研究了几个字符串匹配算法,如果想了解更多更全的算法可以去看《柔性字符串匹配》这本书。下面依次来说说朴素算法,Rabin-Karp算法,Knuth-Morris-Pratt算法,Boyer-Moore算法,sunday算法,以及Aho-Corasick等算法。朴素算法朴素算法是一种非常简单的算法,时间
2013-08-08 22:51:09 977
原创 二叉查找树转变为排序的双向链表
问题:对于输入的一棵二叉查找树,将该二叉查找树转换成一个排序的双向链表,要求不能创建任何新的结点,只调整指针的指向来达到目的。目测这个问题不难解决,应该可以在O(n)的时间复杂度内解决。对于一个二叉查找树,转换为一个从小到大排序的链表,那么根节点的左儿子及其子孙都会在根节点的前面,根节点的右儿子及其子孙都会在根节点的后面。这样,一个递归的算法便可以解决问题。按照这个思路我把代码写了出来,验证结
2013-08-08 22:44:03 666
原创 常量时间的栈操作(min/max)
push,pop,top,size,empty这些操作对于栈来说常量时间的,但是要想实现min,max的常量时间操作需要增加两个栈,一个用于维护最小值,一个用于维护最大值。例如,对于min,每次入栈时将小于等于min栈顶的数值也压到min栈,出栈是如果值等于min的栈顶,将min的栈顶出栈。以下是实现的代码,并不复杂。#include #include using namespace
2013-08-08 22:41:38 744
原创 Linux如何知道当前进程的ID
在应用程序中可以通过getpid这个系统调用来获得当前进程的pid,在内核中可以通过current来获取当前进程的相关信息。而getpid这个系统调用实际上在内核中也是通过current来获取进程pid的,那么current是怎么来的呢?其实,current是根据当前的栈指针计算得来的(具体计算方法这里不详细描述了)。栈指针是在进入内核时设置的,例如,应用程序调用getpid系统调用,
2013-08-08 22:28:05 1230
原创 C风格字符串基本操作
与字符串相关的基本操作包括strlen, strcpy, strcat, strcmp, strchr, strspn, strcspn, strpbrk, strstr, strtok等。在有些平台上,strcpy等使用较多的操作可能直接使用汇编代码编写,本文采用C语言来编写这些函数,然后说说与其相关的一些内容。strlenstrlen这个函数用于计算C风格字符串的长度,而C风格字符串的
2013-08-08 22:21:15 680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人