06 2012 档案

摘要:C标准库中提供了两个用于生成随机数的函数,rand()和srand()。头文件为stdlib.h(cstdlib)。 1、 int rand(void);返回[0,RAND_MAX]内的一个伪随机数。该数通过一个算法获得,该算法每次返回一个随机数序列,而该序列由种子决定。所以为了产生不同的序列,种子必须不同,而种子的设置将会由srand()函数实现。2、 void srand(unsign... 阅读全文
posted @ 2012-06-22 22:26 Cavia 阅读(191) 评论(0) 推荐(0)
摘要:Q:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。 A:如果我们遍历数组是对于每一个元素都要往左和往右判断是否符合条件,则时间复杂度为O(n^2)。既然可以用辅助数组,就可以利用空间换时间的办法进行优化。 原数组为a[n],定义一个辅助数组为b[n]。 首先我们求左边数都小于等于它... 阅读全文
posted @ 2012-06-20 14:51 Cavia 阅读(431) 评论(1) 推荐(0)
摘要:Q:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? A:假设12个人的身高为1,2,3,…,12,我们要将其分为两排,每排六个人,并且要符合题目所述规律,所以我们可以得出以下结论: a、第一排第一个数字只能为1,第一排第二个数字只能为2,3,第一排第三个数字只能为3,4,5,…,第一排第六个数字只能为6,7,8,9,10,11。... 阅读全文
posted @ 2012-06-20 09:41 Cavia 阅读(516) 评论(0) 推荐(0)
摘要:Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。 A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的... 阅读全文
posted @ 2012-06-19 20:39 Cavia 阅读(4462) 评论(1) 推荐(1)
摘要:Q:输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 A:对于一个子树的根结点来说,如果那两个结点分别位于该子树的左右子树,则最低共同父结点为该子树的根结点,如果那两个结点都位于该子树的左子树,则最低共同父结点位于该子树根结点的左子树,否则来自右子树。于是递归代码就出来了。 struct Node{ int val; Node *left,*right;};Node* ... 阅读全文
posted @ 2012-06-19 19:41 Cavia 阅读(1389) 评论(0) 推荐(0)
摘要:Q:题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 A:如果将数组排序,则相同的数字肯定会在一起,因为该数字的个数超过数组长度的一半,所以该数字组成的子数组肯定会跨过数组的中间位置,所以直接返回arr[n/2]即可。不过这个方法需要先排序。 在考虑另一种方案,如果每次删除两个不同的数字,则在剩下的数组中该数字出现的次数仍然超过一半,所以就把该问题转化为一个规模更... 阅读全文
posted @ 2012-06-19 16:18 Cavia 阅读(234) 评论(0) 推荐(0)
摘要:上图表示一个trie树,有abc,abcd,abd,b,bcd,efg,hii七个字符串,红色点代表为一个字符串的最后一个字符。 上图同样表示一个trie树,有abc,d,da,dda四个字符串,字符串尾部同样进行了标记。 已知n个由小写字母构成的平均长度为10的字符串,判断其中是否存在某个串为另一个串的前缀子串,有三种方法: 1、遍历字符串集合,对于遍历的每两个字符串,判断其... 阅读全文
posted @ 2012-06-19 15:19 Cavia 阅读(280) 评论(0) 推荐(0)
摘要:Q:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。 A:这是一道很简单的题,但是考虑全面和优化代码却不是那么容易,一开始乍一看可能就写出这样的代码 double Power(double base,int exponent){ double result=1.0; for(int ... 阅读全文
posted @ 2012-06-19 09:38 Cavia 阅读(215) 评论(0) 推荐(0)
摘要:Q:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。A:对于这个题目,办法就是遍历第一个字符串,每次遍历时查找该字符是否在第二个字符串中,如果在,则要删除该字符。所以该问题就分为两步,查找和删除。按照最笨的做法,查找使用线性查找,即对于每一个字符,遍历第二个字符串,看是否出现。这样时间复杂度太高,如果第一个字符串长度为m,第二个字符串长度为n,则时间复杂度为O(mn)。再看删除,最笨的方法是,对于每一个要删除的字符,将其后的每一个字符都向前挪一位,这样时间 阅读全文
posted @ 2012-06-18 14:30 Cavia 阅读(483) 评论(0) 推荐(0)
摘要:Q:如何判断一个单链表是否有环,如果有环,找出环的入口点?A:首先我们判断链表是否有环,设置两个指针slow和fast,指向单链表的头部,每个循环slow走一步,fast走两步。如果没有环,fast或者fast的next会走到NULL,否则fast在环里循环最终会和slow相遇,此时即存在环。再看第二个问题,当slow和fast相遇时,假设fast已经在环内循环n圈,环长为r,同时fast走的长度为slow走的长度的两倍,设slow走了s步,则有2*s=s+n*r => s=n*r,再设单链表头部到环入口的距离为a,环入口到相遇点得距离为x,则a+x=s=n*r,因此从单链表头部到相遇点 阅读全文
posted @ 2012-06-18 13:44 Cavia 阅读(395) 评论(0) 推荐(0)
摘要:Q:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。A:将数组的每一个元素进行异或,得到的两个不同数字之间的异或,因为这两个数字不同,所以异或值必然不为0,所以我们找出异或值的一个为1的数位,按照该数位是否为0将数组分成两个子数组A和B,可以知道数组A含有的元素中有两个不同数字的一个,其他都是两两相同的数字;数组B含有的元素中有两个不同数字的另外一个,其他也都是两两相同的数字,再分别进行异或,即可求得两个数。 1 #include <iostream> 2 using namespace s 阅读全文
posted @ 2012-06-18 10:14 Cavia 阅读(3479) 评论(0) 推荐(0)
摘要:Q:输入一个字符串,输出该字符串中字符的所有组合。 A:假设一个字符串长度为n,要求长度为m的所有组合。我们考虑字符串中一个字符,我们有两种选择:将其加入组合或者不加入组合。当加入组合时,我们还需要从该字符后面的子串中选取m-1个字符;当不加入组合时,我们需要从该字符后面的子串中选取m个字符,所以递归+回溯即可解出。 #include <iostream>#include <vect... 阅读全文
posted @ 2012-06-14 20:07 Cavia 阅读(462) 评论(0) 推荐(0)
摘要:Q:输入一个字符串,打印出该字符串中字符的所有排列 A:以abc为例,我们首先将a固定在第一位,然后排列bc,当bc排列完成后,我们会将b固定在第一位,也就是交换a和b的位置,变成bac,然后排列ac,当ac排列完成后,我们需要将c固定在第一位,先将a和b的位置复原,在交换a和c的位置即可。因此,用递归来求解再自然不过。对于字符串abcdedfgh….,在以begin为开头的子串中,我们要... 阅读全文
posted @ 2012-06-14 19:45 Cavia 阅读(1026) 评论(0) 推荐(0)
摘要:从低地址到高地址依次为代码段,数据段,bss段,堆,栈,命令行参数和环境变量,其中的那些段来源于elf文件(bss段并不存储在elf文件中);另外,可以看出,栈向低地址生长,而堆向高地址生长。 阅读全文
posted @ 2012-06-14 15:35 Cavia 阅读(244) 评论(0) 推荐(0)
摘要:每一个程序都会接收到一张环境表,与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址。全局变量environ包含了该指针数组的地址:extern char **environ;我们称environ为环境指针。环境由name=value这样的键值对组成,大多数预定义的名字完全由大写字母组成,但这只是一个惯例。ISO C定义了一个函数getenv,可以用其取环境变量1 #include <stdlib.h>2 3 //返回值:指向与name关联的value的指针,若未找到则返回NULL4 char* getenv(const char* name 阅读全文
posted @ 2012-06-14 15:29 Cavia 阅读(358) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2012-06-14 15:13 Cavia 阅读(175) 评论(0) 推荐(0)
摘要:Q:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} 是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。 A:任意将这个数组从中间分开,分成两个数组,则至少有一个数组单调递减,另一个数组则可以由递减数组左移若干位得到,所以我们在二分之后确定界限的时候必须考虑所有情况,即需要查找的数组在哪一个分区里。 首先我们需要判断哪一个分区是单调递减的... 阅读全文
posted @ 2012-06-11 20:57 Cavia 阅读(1004) 评论(0) 推荐(0)
摘要:#include <iostream>using namespace std;//匹配数int num=0;//判断当前n对括号是否匹配bool isMatch(int n,char* bracket){ int left_num=0,right_num=0; for(int i=0;i<2*n;++i) { if(bracket[i]=='l') left_num++; else if(... 阅读全文
posted @ 2012-06-11 19:42 Cavia 阅读(2256) 评论(0) 推荐(0)
摘要:1、求有向图的强连通分量 如果有向图G中的任何两个顶点都相互可达,则G称为一个强连通图。非强连通图的极大强连通子图称为有向图的强连通分量。 Tarjan算法是根据图的深度优先搜索,定义DFN(u)为顶点u在DFS中的次序编号,Low(u)为u或u的子树能够追溯到的最早的栈中顶点的次序编号,则 Low(u)=min{DFN(u),Low(v) if(u,v)是树枝边,DFN(v) if(... 阅读全文
posted @ 2012-06-08 11:32 Cavia 阅读(3897) 评论(0) 推荐(0)
摘要:Radiosity试图使用不同于光线追踪的方法去考虑全局光照的问题,它将几何图元和场景光照划分为小的元素(called patches),然后不考虑摄像机的位置,来计算每一个patch的近似渲染方程。因此,Radiosity是一个和视点无关的方法。 1、定义 Solid Angle-将物体投影到单位球上所形成的角。如下图角w solid angle单位是球面度(steradian,... 阅读全文
posted @ 2012-06-04 09:38 Cavia 阅读(2752) 评论(1) 推荐(0)
摘要:1、Per-Vertex SH Data Generation with D3DX D3DX函数产生的数据是SH系数的集合,可以跨平台使用。 对于Per-Vertex SH coefficient,使用D3DXSHPRTSimulation HRESULT WINAPI D3DXSHPRTSimulation(UINT Order,LPD3DXMESH *ppMeshArray,D3DXSH... 阅读全文
posted @ 2012-06-02 21:02 Cavia 阅读(869) 评论(0) 推荐(1)