上一页 1 ··· 7 8 9 10 11 12 13 14 下一页

2012年5月29日

显示一个序列中和等于10的所有组合

摘要: 这个题的扩展应用很多,虽然下面运算的复杂度很高,但是其思想非常巧妙,借助位运算实现了所有可能的组合,关键是该思想值得借鉴,在没有比较好的方法的情况下,我们就需要一个个来试,但是要一个不漏的把所有情况都考虑到一般的方法很麻烦下面就详细介绍一下该算法的思想:(1)首先根据序列的长度确定组合数,如长度为8则最大的组合只可能是8(2)从1到1<<8中每一个数的等于1的位就代表一种组合,我们把这种组合对应的数相加,看其是否等于所求的值,如何是就输出对应位的值该算法显然可以再进行优化,但是其依然很难在大数据面前有效首先就是循环的次数上,如果序列的长度是n,则需要查找的次数为2n-1,指数倍的增 阅读全文

posted @ 2012-05-29 11:51 为梦飞翔 阅读(830) 评论(0) 推荐(0)

2012年5月28日

在从1到n的正数中1出现的次数

摘要: 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。简单的方法就是按照给位进行分析在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);十位位出现1的个数=n/100*10+(十位=0,0;十位>1,10,;十位=1,低一位+1);百位出现1的个数=n/1000*100+(百位=0,0;百位>1,100;百位=1,低两位+1);等等算法的复杂度仅仅和位数有关算法描述:(1)求出所给正整数a的位数, 阅读全文

posted @ 2012-05-28 15:40 为梦飞翔 阅读(4653) 评论(0) 推荐(0)

栈的push、pop序列

摘要: 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。基本思路:(1)用两个指针分别指向数组的头部,pPush,pPop;(2) 阅读全文

posted @ 2012-05-28 12:41 为梦飞翔 阅读(1783) 评论(0) 推荐(0)

左旋转字符串

摘要: 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。思路:把字符串看出两个XY(XTYT)T=YXXT为X的旋转操作 1 void inverse(char* start,char* end){ 2 while(start<end){ 3 char temp=*start; 4 *start=*end; 5 *end=*start; 6 start++... 阅读全文

posted @ 2012-05-28 10:15 为梦飞翔 阅读(279) 评论(0) 推荐(0)

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 为梦飞翔 阅读(1155) 评论(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 为梦飞翔 阅读(261) 评论(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 为梦飞翔 阅读(7186) 评论(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 为梦飞翔 阅读(275) 评论(0) 推荐(0)

二叉树的直径

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

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

上一页 1 ··· 7 8 9 10 11 12 13 14 下一页

导航