随笔分类 - Algorithm
摘要:常规的判断1-n以内的素数的时间复杂度为O(n*sqrt(n)),在n很大的时候时间很长,所以需要别的方法来判断素数。这里介绍筛选法。 1、申请一个数组bool prime[n+1],初始化所有的奇数下标为true,偶数下标为false(2例外)。 2、 for(int i=3;i<=sqrt(n);i+=2){ if(prime[i]) { for(int j=...
阅读全文
摘要:斐波那契数列的通俗解法是利用递推公式进行递归求解,我们可以更优化的去解决它。 方法一:通项公式 斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2),特征方程为:x2=x+1,解该方程得(1+sqrt(5))/2,(1-sqrt(5))/2.所以f(n)=Ax1n+Bx2n,带入f(0)=0,f(1)=1得A=sqrt(5)/5,B=-sqrt(5)/5.则f(n)求出。 方法...
阅读全文
摘要:不需要辅助数组即可归并。 关键在于merge这个函数。两段递增的子数组arr[begin…mid-1]和arr[mid…end],i=begin,j=mid,k=end i往后移动,找到第一个arr[i]>arr[j]的索引 j往后移动,再找第一个arr[j]>arr[i]的索引 然后我们将i到mid的部分和mid到j-1的部分对调,较小的部分就调到前面去了,然后从后面的...
阅读全文
摘要:Q:有这样一种编码:如,N=134,M=f(N)=143,N=020,M=fun(N)=101,其中N和M的位数一样,N,M可以均可以以0开头,N,M的各位数之和要相等,即1+3+4=1+4+3,且M是大于N中最小的一个,现在求这样的序列S,N为一个定值,其中S(0)=N,S(1)=fun(N),S(2)=fun(S(1)) A:要求一个数n的f(n),并且要符合位数相等,各位之和也要相等...
阅读全文
摘要:Q:五笔的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把五笔的编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 1)...
阅读全文
摘要:Q: 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]。 要求: 1.不准用除法运算 A: 要求一:线性时间复杂度,空间复杂度不限。 很简单,两个辅助数组。 void Func(int *a,int *b,int n){ int *left=new int[n]; int *r...
阅读全文
摘要:Q:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10 A:要构造rand10(),则需要保证1-10的每一个数出现的概率为1/10。rand7()能够出现1-7的等概率数字,两次rand7()能出现49种等概率的数字,而如果我们有0-48这49种数字num的话,则当num<40的前提下,num/4+1就能构造出1-10这十个数字...
阅读全文
摘要:之前在http://www.cnblogs.com/daniagger/archive/2012/06/14/2549777.html中描述了全排列算法的递归解法,这里再说一种算法--字典序排列。 字典序排列就是按照字典a-z,1-9的顺序给出字符串的顺序全排列,例如abc的全排列就是从abc一直排到cba。那么给定一个字符串,怎么找出恰好大于该字符串的下一个排列呢? 我们考虑如下的步骤: ...
阅读全文
摘要:Q:如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。 例如,对于整数8,可以作为如下三种分解: (1) 8 = 2 + 2 + 2 + 2 (2) 8 = 2 + 3 + 3 (3) 8 = 3 + 5 A:...
阅读全文
摘要:Q:求一个数组的最长递增子序列 A:数组为arr[n] 一个O(n^2)的算法 利用动态规划,利用一个辅助数组b[n],b[i]为对应以arr[i]结尾的最大递增子序列的长度,初始b[0]=1。从arr[1]到arr[n-1]的每次遍历中,设element=arr[i],考虑从当前索引i往前的所有索引j,如果element>arr[j],则当前element有可能扩展成一个新的递增子序...
阅读全文
摘要:Q:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间 A: 方法一: 将1001个数加起来,再减去1+2+3+…+1000,不过这种方法不通用,容易溢出。 方法二: 将1001个数异或,然后和1^2^3^…^1000的结果进行异或,最后的结果就是要求的数。
阅读全文
摘要:Q:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 A:注意判断转向和每次转向的临界。 四个转向:右->下,下->左,左->上,上->右 临界初始(矩阵为mxn):右临界为n-1,下临界为m-1,左临界为0,上临界为1 //定义四个方向enum Direct {Left,Right,Up,Down};void Func(int **matrix,int m,int...
阅读全文
摘要:给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1,0] K=21 那么输出结构应该为100。
阅读全文
摘要:Q:n!的末尾有多少个0A:n!=1*2*3*…*n,在质数中只有2*5=10,能够给最后结果末尾贡献0,所以将n!进行质数分解为2^m*…*5^n*…,末尾0的个数就等于min(m,n),又因为2出现的个数肯定多过5出现的个数,所以m>n,因此只需要统计n的个数即可。那么怎么计算n呢,有两种方法。方法1:直接的方法,从1到n,计算每一个数中因子5的个数。int num=0;for(int i=1;i<=n;++i){ int j=i; while(j%5==0) { num++; j=j/5; }}方法2:利用公式,num=[N/5]+[N...
阅读全文
摘要:Q:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字? A:首先定义长度为1000的数组,将前1000个关键字放置到数组中。然后对于第1001及以后的每一个关键字(设为第n个),这个关键字被选中的概率为1000/n,所以以这个概率来和数组中随机一个元素替换。 //1000/n概率的实现if(rand...
阅读全文
摘要:初始确定一个开始顶点source,一个空的集合S,用来存储已探索到的顶点,初始化为空,一个队列Q,初始化也为空。 1、将source加入Q中 2、如果Q为空,失败且退出 3、选出Q中的第一个顶点,移出并加入S中,称该顶点为u 4、如果u是目标顶点,获得解决方案,并成功退出 5、否则得到u的所有相邻顶点,进行处理,并将这些相邻顶点加入Q 6、按照启发方式对Q进行排序 7、返回步骤2 ...
阅读全文
摘要:C标准库中提供了两个用于生成随机数的函数,rand()和srand()。头文件为stdlib.h(cstdlib)。 1、 int rand(void);返回[0,RAND_MAX]内的一个伪随机数。该数通过一个算法获得,该算法每次返回一个随机数序列,而该序列由种子决定。所以为了产生不同的序列,种子必须不同,而种子的设置将会由srand()函数实现。2、 void srand(unsign...
阅读全文
摘要:Q:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 A:如果我们遍历数组是对于每一个元素都要往左和往右判断是否符合条件,则时间复杂度为O(n^2)。既然可以用辅助数组,就可以利用空间换时间的办法进行优化。 原数组为a[n],定义一个辅助数组为b[n]。 首先我们求左边数都小于等于它...
阅读全文
摘要:Q:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? A:假设12个人的身高为1,2,3,…,12,我们要将其分为两排,每排六个人,并且要符合题目所述规律,所以我们可以得出以下结论: a、第一排第一个数字只能为1,第一排第二个数字只能为2,3,第一排第三个数字只能为3,4,5,…,第一排第六个数字只能为6,7,8,9,10,11。...
阅读全文
摘要:Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。 A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的...
阅读全文
浙公网安备 33010602011771号