07 2012 档案

摘要:不需要辅助数组即可归并。 关键在于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的部分对调,较小的部分就调到前面去了,然后从后面的... 阅读全文
posted @ 2012-07-25 15:22 Cavia 阅读(4083) 评论(3) 推荐(0)
摘要: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),并且要符合位数相等,各位之和也要相等... 阅读全文
posted @ 2012-07-21 09:28 Cavia 阅读(461) 评论(1) 推荐(1)
摘要: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)... 阅读全文
posted @ 2012-07-20 09:36 Cavia 阅读(3005) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2012-07-17 16:37 Cavia 阅读(322) 评论(0) 推荐(0)
摘要: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这十个数字... 阅读全文
posted @ 2012-07-17 10:45 Cavia 阅读(388) 评论(0) 推荐(0)
摘要:之前在http://www.cnblogs.com/daniagger/archive/2012/06/14/2549777.html中描述了全排列算法的递归解法,这里再说一种算法--字典序排列。 字典序排列就是按照字典a-z,1-9的顺序给出字符串的顺序全排列,例如abc的全排列就是从abc一直排到cba。那么给定一个字符串,怎么找出恰好大于该字符串的下一个排列呢? 我们考虑如下的步骤: ... 阅读全文
posted @ 2012-07-17 09:31 Cavia 阅读(1865) 评论(0) 推荐(0)
摘要: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:... 阅读全文
posted @ 2012-07-16 16:21 Cavia 阅读(968) 评论(1) 推荐(0)
摘要: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有可能扩展成一个新的递增子序... 阅读全文
posted @ 2012-07-16 14:49 Cavia 阅读(339) 评论(0) 推荐(0)
摘要:Q:1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间 A: 方法一: 将1001个数加起来,再减去1+2+3+…+1000,不过这种方法不通用,容易溢出。 方法二: 将1001个数异或,然后和1^2^3^…^1000的结果进行异或,最后的结果就是要求的数。 阅读全文
posted @ 2012-07-16 13:22 Cavia 阅读(402) 评论(0) 推荐(0)
摘要:Q:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 A:注意判断转向和每次转向的临界。 四个转向:右->下,下->左,左->上,上->右 临界初始(矩阵为mxn):右临界为n-1,下临界为m-1,左临界为0,上临界为1 //定义四个方向enum Direct {Left,Right,Up,Down};void Func(int **matrix,int m,int... 阅读全文
posted @ 2012-07-16 10:13 Cavia 阅读(205) 评论(0) 推荐(0)
摘要:给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1,0] K=21 那么输出结构应该为100。 阅读全文
posted @ 2012-07-11 11:19 Cavia 阅读(140) 评论(0) 推荐(0)
摘要: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... 阅读全文
posted @ 2012-07-11 10:07 Cavia 阅读(219) 评论(0) 推荐(0)
摘要:Q:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字? A:首先定义长度为1000的数组,将前1000个关键字放置到数组中。然后对于第1001及以后的每一个关键字(设为第n个),这个关键字被选中的概率为1000/n,所以以这个概率来和数组中随机一个元素替换。 //1000/n概率的实现if(rand... 阅读全文
posted @ 2012-07-11 09:25 Cavia 阅读(754) 评论(0) 推荐(0)
摘要:初始确定一个开始顶点source,一个空的集合S,用来存储已探索到的顶点,初始化为空,一个队列Q,初始化也为空。 1、将source加入Q中 2、如果Q为空,失败且退出 3、选出Q中的第一个顶点,移出并加入S中,称该顶点为u 4、如果u是目标顶点,获得解决方案,并成功退出 5、否则得到u的所有相邻顶点,进行处理,并将这些相邻顶点加入Q 6、按照启发方式对Q进行排序 7、返回步骤2 ... 阅读全文
posted @ 2012-07-06 09:08 Cavia 阅读(393) 评论(0) 推荐(0)
摘要:特权(如能改变当前日期的表示法以及访问控制)是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。一般来说我们总是试图使用最小特权(least privilege)。1 #include <unistd.h>2 3 //设置实际和有效用户ID和组ID,若成功则返回0,出错则返回-14 int setuid(uid_t uid);5 6 int setgid(gid_t 阅读全文
posted @ 2012-07-04 17:11 Cavia 阅读(2330) 评论(0) 推荐(0)
摘要:当进程调用exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的代码段、数据段、堆和栈。 1 #include <unistd.h> 2 3 //若出错则返回-1,若成功则不返回值 4 5 int execl(const char *pathname,const char *arg0,.../*(char*)0*/); 6 7 int execv(const char *pathname,char *const argv[]); 8 9 int e 阅读全文
posted @ 2012-07-04 16:48 Cavia 阅读(285) 评论(0) 推荐(0)
摘要:1 #include <sys/wait.h>2 3 //若成功则返回进程ID,若出错则返回-14 pid_t wait(int *statloc);5 6 pid_t waitpid(pid_t pid,int *statloc,int options);当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是一个异步事件,所以这种信号也是内核向父进程发送的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。对这种信号的默认动作是忽略它。对任一终止情形,我们都希望终止进程能够通知其父进程它是如何终止的。该终止 阅读全文
posted @ 2012-07-04 15:08 Cavia 阅读(1828) 评论(0) 推荐(0)
摘要:进程的正常终止方式有:1、在main函数内执行return语句,等效于调用exit2、调用exit函数,其操作包括调用各个终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流3、调用_exit或_Exit函数,为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O流是否进行冲洗取决于实现。4、进程的最后一个线程在其启动例程中执行返回语句,该线程的返回值不会用作进程的返回值。当最后一个线程从其启动例程返回时,该进程以终止状态0返回5、进程的最后一个线程调用pthread_exit函数,这种情况下进程终止状态总是0进程的异常终止方式有:1、调用ab 阅读全文
posted @ 2012-07-04 14:49 Cavia 阅读(253) 评论(0) 推荐(0)
摘要:1 #include <unistd.h>2 3 pid_t fork(void);一个现有进程可以调用fork函数创建一个新进程。由fork函数创建的新进程称为子进程(child process)。fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值为0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有的子进程ID。使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid获得其父进程ID。子进程和父进程继续执行fork调用之后的指 阅读全文
posted @ 2012-07-04 13:56 Cavia 阅读(1434) 评论(1) 推荐(1)