算法
文章平均质量分 57
dlengong
这个作者很懒,什么都没留下…
展开
-
字符串旋转与移位
在好多字符串处理中,旋转与移位是很常见到的,在大规模的数据处理中设计高效的算法是必须的示例:把字符串abcdefgh循环左移3位,变为defghabc输入字符串str与移位数m,输出结果1、看到题之后一般的想法就是一位一位的移动abcdefghbcdefghacdefghabdefghabc 实现代码如下 void movebit(string &原创 2012-01-07 21:58:43 · 4475 阅读 · 0 评论 -
两个指针(位置)的妙用
使用两个指针可以轻松的解决许多算法问题,归纳出如下几种1、 判断链表是否带环带环链表的判断是链表中经常考察的内容。一个循环链表可以无休止地遍历下去。我们可以定义两个指针,一个快指针一个慢指针,如果在遍历到尾端前二者相遇,那么链表就是有环链表bool haveCycle(LinkList * Head){ if (!Head) { return false; }原创 2012-04-01 11:12:26 · 4873 阅读 · 4 评论 -
如何选择到最好女孩
假设你是一位男孩,而上天在你20-30岁间安排了20位适合你的女孩。这些女孩都愿意作为你的伴侣,但你只能选择他们其中一个。选择的条件如下:对于你来说,这20位女孩是可以排序的,也就是说事后你可以对她们的质量进行排名,排名第一的女孩对你来说就是最好的,排名第二十的对你来说就是最差的。这20位女孩不是同时出现在你的生命中,而是按照时间顺序先后出现,每出现一个你都要决定留下还是拒绝。如果原创 2012-08-26 15:20:49 · 4215 阅读 · 9 评论 -
随机生成0到n之间的m个数
如何用随机数生成0到n之间的m个不重复的数1、最直接的方法就是先随机生成一个0到n之间的数,判断这个数是否已被选上,如果以前没选过,则选上,如果以前已选,则丢弃void common(int n,int m){ int * randnum=(int *)malloc(n*sizeof(int)); memset(randnum,0,n*sizeof(int)); //把n个位原创 2012-09-01 17:13:39 · 6707 阅读 · 1 评论 -
逆序数的几种求法
求一个数列的逆序数逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],a[j] (i,如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对逆序数:一个数列中逆序对的总数如数列 3 5 4 8 2 6 9(5,4)是一个逆序对,同样还有(3,2),(5,2),(4,2)等等那么如何求得一个数列的逆序数呢?方法1:一个一个的数最简单也是最容易想到的方法原创 2012-05-23 15:38:43 · 102181 阅读 · 10 评论 -
质数(素数)的几种求法
质数就是只能被1和它本身整除的数。求质数在程序设计和算法中很常见,尤其是在密码学中经常用到质数。最通常的想法就是依据定义来求质数如求100以内的质数,我们会写出如下的算法:int prime_1(int num){ int cur=2; int count=0; //记录质数个数 while (cur<num) { int factor=2; //每次循环从原创 2012-04-04 15:26:41 · 8139 阅读 · 2 评论 -
几个有趣的小题
1、南大的一道面试题:用4个0,经过各种运算后得出24看到题时第一感觉就蒙了,因为用通常的加减乘除无论怎么算结果都是0,所以就要拓展思维,跳出常规思路(1) ( 0!+0!+0!+0!)! 用阶乘把0变为1,接着运算(2) (cos0+cos0+cos0+cos0)! 通过上一种方法的启示,用0变为1,当然类似的还有(3) (exp(0)+exp(0)+exp(0)+exp(0原创 2012-03-29 17:04:15 · 1680 阅读 · 0 评论 -
括号的匹配方法
输入括号的数目,输出括号的各种合法匹配样式 如输入 2输出 ( ())()()据说这是一道某公司的面试题,我们先来分析一下。括号匹配有合法有的不合法 如 (()))( 这样就不是合法的匹配样式。为了避免这种情况的出现,记录当前左括号的个数和右括号的个数,使右括号的个数不大于左括号的个数。主要思想类似于0-1背包问题,当进行到某一步的时候 有两种方法:放'(' 和 放 ')'原创 2012-03-29 17:53:21 · 3727 阅读 · 2 评论 -
求幂运算
说起求幂,相信很多人说这还不简单,挨个乘起来不就行了,比如求2的5次幂pow(2,5),直接想到的方法如下:int cPow(int a,int b){ int result=1; for (int i=0;i<b;++i) { result*=a; } return result;}这样的话求一个数的n次幂,时间复杂度为O(n)那有没有更快的方法呢?原创 2012-03-12 18:59:15 · 5525 阅读 · 0 评论 -
求1+2+3+···
求1+2+3+···+n,要求不用for、while、if、else、switch、case等控制语句这道题本身并不难,主要难在限制条件。通常情况我们求n的前n项和除了用前n项和公式n*(n+1)/2外,就是用循环和递归,连续累加n次。但是题目要求不用循环控制语句。这给我们出了一个难题。如果用循环就要用到while或者for,用递归的话就要用到if判断。这该怎么办呢?解法一:求n个数的原创 2012-03-24 17:17:13 · 2290 阅读 · 0 评论 -
如何快速找出单词的变位词
给定一个英语字典,找出其中的所有变位词的集合。例如,”pots”、”stop”和”tops”互为变位词,因为每一个单词都可以通过改变其他单词中字幕的顺序来得到解决这个问题最直接的想法就是全排列给定的单词,对于得到的每一个字符串序列从字典中查找是否为一单词,如果是则输出否则测试下一个序列。对于短单词不失为一种实现方法,但是如果单词的长度很长,如”cholecystoduodenostomy”的一原创 2012-02-15 19:44:10 · 5307 阅读 · 3 评论 -
折半查找及其扩展
在查找算法中,最简单的方法就是顺序查找,其复杂度为O(n)另一种很高效的方法就是折半查找,主要思想为:中间元素与给定查找元素比较,如果相等则返回该位置,如果大于给定元素则从低半区查找,如果小于给定元素则从高半区查找,如此往复,直至查到元素为止。折半查找的复杂度为O(logn),但使用该方法的前提是在已序的数组中。程序如下:int search(int array[],int n,int v原创 2012-02-15 19:55:10 · 1092 阅读 · 1 评论 -
高效实用的异或操作
异或(XOR)是一种位运算符,相同为0,相异为1如0^1=1,0^0=0,1^1=0异或满足交换律、结合律a^b=b^aa^(b^c)=a^b^c=(a^b)^ca^b^c^d=a^d^c^b异或是一种位运算,能够高效地巧妙地完成一些功能1、 实现两个数的交换,swap函数 void swap(int &a,int &b){ a^=b; b^=a;原创 2012-01-08 16:08:09 · 4826 阅读 · 0 评论