2012年5月25日

Fibonacci序列or兔子序列

摘要: 题目:定义Fibonacci数列如下: / 0 n=0f(n)= 1 n=1 / f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,但....呵呵,你知道的。。这个一种O(n)复杂度的就是int a=0,b=1,c;for(int i=2;i<=n;i++){ c=a+b; a=b; b=c;}printf c;另外一个更牛的这还不是最快的方法。下面介绍一种时间复杂度是O(logn)的方法。在介绍这种方法之前,先介绍一个数学公式:{f(n)... 阅读全文

posted @ 2012-05-25 22:41 为梦飞翔 阅读(1152) 评论(0) 推荐(0)

约瑟夫环问题

摘要: 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。这个问题数学上已经得出了递推公式递推公式: f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)当然我们就不推了,这里给出一个中规中矩的用环的方法来解决此问题 1 Node* Josephus(Node* Head,int m){ 2 Node* p=Head; 3 while(true){ 4 ... 阅读全文

posted @ 2012-05-25 20:32 为梦飞翔 阅读(259) 评论(0) 推荐(0)

题目:输入一颗二元查找树,将该树转换为它的镜像,

摘要: 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / / 6 10// //5 7 9 11输出: 8 / /10 6// //11 9 7 5定义二元查找树的结点为:struct BSTreeNode // a node in the binary search tree (BST){ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node};分析: 阅读全文

posted @ 2012-05-25 17:26 为梦飞翔 阅读(509) 评论(0) 推荐(0)

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。

摘要: 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字M,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。思路:(1)让指针指向数组的头部和尾部,相加,如果小于M,则增大头指针,如果大于则减小尾指针(2)退出的条件,相等或者头部=尾部算法:void function(int a[],int n,int M){ int i=0,j=n-1; while(i!=j){ if(a[i]+a[j]==M){ printf("%d,%d",a[i],a[j]); break; } a[i]+a... 阅读全文

posted @ 2012-05-25 17:01 为梦飞翔 阅读(7185) 评论(0) 推荐(0)

求1+2+…+n,

摘要: 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。方法:从递归下手一般是这样的int sum(int n){ if(n==0) return 0; return n+sum(n-1);}把上述稍加改动即可int sum(int n){ return n&&(n+sum(n-1));} 阅读全文

posted @ 2012-05-25 16:23 为梦飞翔 阅读(273) 评论(0) 推荐(0)

二叉树的直径

摘要: 基本思路:(1)求每个节点左右子树的深度,则进过该节点的最大length=ldeep+rdeep;(2)取最大的length即为二叉树的直径当然这个算法性能不好,但思路很简单,这次也采用递归算法,如果要求采用非递归的话,首先需要改动的是TreeDeep,然后FindMax这个实际上市递归遍历每个节点,可以用遍历的非递归形式替换即可。(如果有人想要看非递归又不会,给我留言,我就添加上)这个问题一个延伸,就是输出最长路径给出一个思路抛砖引玉:在FindMaxLen函数外面添加一个全局变量BitTree finalroot;修改MaxLen=处的代码为if(temp>MaxLen){ MaxL 阅读全文

posted @ 2012-05-25 14:08 为梦飞翔 阅读(2936) 评论(1) 推荐(1)

翻转句子中单词的顺序

摘要: 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:先反整个句子,再反转每个单词输出 阅读全文

posted @ 2012-05-25 12:59 为梦飞翔 阅读(278) 评论(0) 推荐(0)

导航