摘要:
1. 解决实际问题通过几个实例说明正则表达式是十分有用的: · 检查许多文件,确保每一行中的"SetSize"的出现次数与"ResetSize"的出现次数一样多,而且要保证大小写不敏感。 · 处理远端机器上的某些E-mail,把邮件的标题作为列表整理出来。使用了grep工具和正则表达式"^(From|Subject)" · 查找一个特殊的(5000行!)邮件。使用sed工具和正则表达式。2.作为编程语言的正则表达式 完整的正则表达式由两种字符构成。特殊字符称为元字符,普通字符称为文字。如果把正则表达式比作 阅读全文
摘要:
1. 函数原型 int atoi ( const char * str ); long int atol ( const char * str );2. 函数工作 atoi是将字符串转化为整型,atol是将字符串转化为长整型,这两个函数的实现十分相似。工作步骤基本如下: ·跳过若干空格、制表符等 ·如果有正号或者负号,进行识别 ·将数字整合到结果中,直到字符串遍历完毕或者遇到数字以外的其他字符为止。 C库中的atoi会尽可能的把更多的数字整合到结果中,不能发现数值溢出的问题。而且对于“整数+其他字符”这样的字符串识别出其中的“整数”,并不考虑后面的字符串中有没有非 阅读全文
摘要:
1. 函数原型(c++ reference) void * memcpy ( void * destination, const void * source, size_t num );不能解决某些覆盖问题。 char * strcpy ( char * destination, const char * source ); 不能解决某些覆盖问题,根据'\0'表示字符串复制终止。void * memmove ( void * destination, const void * source, size_t num ); 能够解决所有覆盖问题。 void * memset ( v 阅读全文
摘要:
1. 简述1.1 一般方法 计数排序的排序对象一般是整数。 假设待排序数组为 int array[], 数组长度为n。第一步:开辟临时数组,int tmp[],数组长度为n。int count,数组长度为10。 第二步:遍历数组,得到最大数值的位数d,即后面需要d次排序。 第三步:根据个位进行排序,根据十位进行排序,···,根据d位进行排序。 对于根据i位进行排序,其中1<=i<=d 首先,统计array的所有元素在d位上的出现次数,保存到int count[]中。 然后,根据count[]计算得到,array应该在tmp中的出现的最后的位置,即cou 阅读全文
摘要:
1. 简述 计数排序的排序对象一般是整数。 假设待排序数组为 int array[], 数组长度为n。 第一步,遍历数组,得到数组的最大值max和最小值min。 (n) 第二步,开辟一个新数组,int count[],数组长度为max-min+1,其中每个元素初始化为0。 第三步,遍历array数组,在count数组内统计array中每个元素出现的个数。(n) 第四步,根据count数组,填充array数组。(n+k)2.复杂度 假设array中的数值范围是k,其中k=max-min+1,那么时间复杂度是O(n+k),实际上这个复杂度算的是第四步的时间复杂度,四个步骤中,遍历元素的次数应该是n 阅读全文
摘要:
1. 简述 假设待排序数组为 int array[], 数组长度为n。该方法实质上是一种分组插入方法。假设数组长度n=10,我们设定几个分组的个数为1,3,5。 首先,分5组,即(array[0],array[5]), (array[1],array[6]), (array[2],array[7]),...,每组内部进行插入排序 然后,分3组,即(array[0],array[3],array[6],array[9]), (array[1],array[4],array[7]), (array[2],array[5],array[8]), 每组内部进行插入排序 最后,分1组,即array[0] 阅读全文
摘要:
1. 简述 假设待排序数组为 int array[], 数组长度为n。 主要是利用堆的性质。对于升序排序,使用最大堆。 首先,建堆,使用递归后根序遍历得方法,通过交换元素,保证根元素比孩子元素大。 第1趟,堆顶元素array[0]与array[n-1]交换,保证array[n-1]的数值正确,根据array[0]新的数值更新堆。 第2趟,堆顶元素array[0]与array[n-2]交换,保证array[n-2]的数值正确,根据array[0]新的数值更新堆。 ··· 第n-1趟,堆顶元素array[0]与array[1]交换,保证array[1]的数值正确,根据 阅读全文
摘要:
1. 简述 假设待排序数组为 int array[], 数组长度为n。快速排序是一个递归得方法。 当n==1的时候,停止排序。 当n>1的时候,首先选择数组中得一个元素作为基准,然后,把小于这个基准得元素放到这个基准的左边,把大于这个基准得元素放到这个元素得右边。 具体实现下面进行简单得说明,假设array[0]作为基准:首先,存储基准得值,int tmp=array[0];然后,两个指针,int left=0; int right = n-1;boolflag_left = false; // 初始从右边开始while(left< right) {if(flag_left == 阅读全文
摘要:
1. 简述 假设待排序数组为 int array[], 数组长度为n。归并排序是一个递归得方法。 当n==1时,停止递归。 当n>1时,开辟一个与array同样大小得数组,int tmp[] 将array[0]-array[n/2]得数组递归排序,将array[n/2+1]-array[n-1]的数组递归排序 将两部分数组,分别用两个指针,将小得元素一个一个放入到tmp数组中。 将tmp复制到array中,然后,释放tmp数组。2. 复杂度 平均时间复杂度为O(N*LogN),空间复杂度为O(N)。 稳定性是稳定得排序,注意程序中,两个指针在比较得时候,如果大小相同,应该把第一个指针得数 阅读全文
摘要:
1. 简述 假设待排序数组为 int array[], 数组长度为n。 第1趟排序,从array[0]-array[n-1]中,选择最小的元素,如果该元素不是array[0],则与其交换。 第2趟排序,从array[1]-array[n-1]中,选择最小的元素,如果该元素不是array[1],则与其交换。 ··· 第n-1趟排序,从array[n-2]-array[n-1]中,选择最小的元素,如果该元素不是array[n-2],则与其交换。2. 复杂度 交换的次数介于[0,n-1],但是比较的次数是(n+1)*n/2左右。最好、最坏和平均的比较次数都是固定的,因此 阅读全文