![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 53
notishell
这个作者很懒,什么都没留下…
展开
-
几个字符串匹配算法
字符串匹配算法是一种应用很广泛的算法,在入侵检测、关键词匹配等技术中都需要使用到。我专门研究了几个字符串匹配算法,如果想了解更多更全的算法可以去看《柔性字符串匹配》这本书。下面依次来说说朴素算法,Rabin-Karp算法,Knuth-Morris-Pratt算法,Boyer-Moore算法,sunday算法,以及Aho-Corasick等算法。朴素算法朴素算法是一种非常简单的算法,时间原创 2013-08-08 22:51:09 · 961 阅读 · 0 评论 -
非递归实现快速排序
非递归实现快速排序的方法和递归类似,其实所有的递归程序都能写成非递归的形式,只要将隐式的栈改成显示的栈即可。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 · 1012 阅读 · 0 评论 -
寻找发帖“水王”
在编程之美中有《寻找发帖“水王”》这么一题,这题书上提供了一个比较好的解法。对于某个元素超过总数N的1/M这类问题有一个通用的方法来解决。试看这样的操作:每次取出M个不同的元素,然后求解余下元素中超过总数1/M的元素。最终将能剩下M-1个元素,超过总数的1/M的元素肯定在其中,计算一下这些元素的数量即可得到解。总的时间复杂度最少能达到O(NMlogM),下面代码实现了这个思路。#include原创 2013-09-05 12:20:56 · 1077 阅读 · 0 评论 -
连连看游戏中的最短路径
连连看游戏是一个比较简单的游戏,两个相同的点可以消除,但前提是两点之间的路径不能有多于两个折点。如何去求解两个点之间的距离呢?我们可以将这里的距离定义为二元组(x,y),x表示多少次转折,y表示路径长度。x值越小距离越短,相同x值的情况下y值越小距离越短。这样下面就容易写代码了。#include #include using namespace std;const int N = 20原创 2013-09-04 23:03:02 · 1895 阅读 · 0 评论 -
快速排序
快速排序的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 · 482 阅读 · 0 评论 -
和为指定值的连续序列
输入一个整数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 · 1019 阅读 · 0 评论 -
阿拉伯数字转换为中文数字
有次在百度的面试中遇到了这个问题,当时做的比较挫,现在仔细想了一下然后写了这样的一段代码。我是按照人对数字的分析来写的这段代码。首先,如果在数字中有小数部分,那么直接从末尾开始将小数部分的每一位转换为中文,即代码20-28行所示,最后需要增加一个“点”字。然后,从小数点左边的低位到高位四位四位地进行转换,如代码34-51行所示。flag是0位数的计数,如果当前四位全是0那么不需要每四位的单位,原创 2013-08-08 23:04:18 · 1077 阅读 · 0 评论 -
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 · 732 阅读 · 0 评论 -
数独求解
数独是一个很经典的问题,由于数独的规模很小,暴力破解数独也是一个很不错的方法!我就是采用暴力破解的办法去寻找数独的解,在求解的过程中按照人类的思维大大减少了搜索路径的数量!我设置了一个标记,flag用于标记某一行、某一列以及某一块是否已经有了某个数,见代码31-33行,每次向空格里填一个数,然后添加标记,接下来的搜索中在冲突区域就不会再使用这个数了。这种方法避免了每次填完所有空再检验!#i原创 2013-08-08 23:02:55 · 782 阅读 · 0 评论 -
填充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 · 1308 阅读 · 0 评论