S2 S1 S3 S1 S4 S1 S6 S5 S1 S5 S1 S1
①分别求出str1、str2的长度m、n
②将两个链表的表尾对齐。p、q两个指针。
③p、q两个指针同步移动,直到指向相同结点。
先将n个数据(前后对应交换)原地逆置,然后再将前n-p和后p个分别原地逆置。 Void reverse(int r[], int left, int right) {
int k=left, j=right, temp; while (k temp=r[k]; r[k]=r[j]; r[j]=temp; k++;j--; } } Void leftshift(int r[], int n, int p) { if(p>0&&p { reverse(r,0,n-1);reverse(r,0,n-p-1);reverse(r,n-p,n-1);} } 4. [题目分析]题目中要求矩阵两行元素的平均值按递增顺序排序,由于每行元素个数相等,按平均值排列与按每行元素之和排列是一个意思。所以应先求出各行元素之和,放入一维数组中,然后选择一种排序方法,对该数组进行排序,注意在排序时若有元素移动,则与之相应的行中各元素也必须做相应变动。 void Translation(float *matrix,int n) //本算法对n×n的矩阵matrix,通过行变换,使其各行元素的平均值按递增排列。 {int i,j,k,l; float sum,min; //sum暂存各行元素之和 float *p, *pi, *pk; for(i=0; i {sum=0.0; pk=matrix+i*n; //pk指向矩阵各行第1个元素. for (j=0; j *(p+i)=sum; //将一行元素之和存入一维数组. }//for i for(i=0; i for(j=i+1;j {pk=matrix+n*k; //pk指向第k行第1个元素. pi=matrix+n*i; //pi指向第i行第1个元素. for(j=0;j {sum=*(pk+j); *(pk+j)=*(pi+j); *(pi+j)=sum;} sum=p[i]; p[i]=p[k]; p[k]=sum; //交换一维数组中元素之和. }//if }//for i free(p); //释放p数组. }// Translation [算法分析] 算法中使用选择法排序,比较次数较多,但数据交换(移动)较少.若用其它 2 排序方法,虽可减少比较次数,但数据移动会增多.算法时间复杂度为O(n). 7.[题目分析]我们用l代表最长平台的长度,用k指示最长平台在数组b中的起始位置(下标)。用j记住局部平台的起始位置,用i指示扫描b数组的下标,i从0开始,依次和后续元素比较,若局部平台长度(i-j)大于l时,则修改最长平台的长度k(l=i-j)和其在b中的起始位置(k=j),直到b数组结束,l即为所求。 void Platform (int b[ ], int N) //求具有N个元素的整型数组b中最长平台的长度。 {l=1;k=0;j=0;i=0; while(i {while(i if(i-j+1>l) {l=i-j+1;k=j;} //局部最长平台 i++; j=i; } //新平台起点 printf(“最长平台长度%d,在b数组中起始下标为%d”,l,k); }// Platform 8.[题目分析]矩阵中元素按行和按列都已排序,要求查找时间复杂度为O(m+n),因此不能采用常规的二层循环的查找。可以先从右上角(i=a,j=d)元素与x比较,只有三种情况:一是A[i,j]>x, 这情况下向j 小的方向继续查找;二是A[i,j] void search(datatype A[ ][ ], int a,b,c,d, datatype x) //n*m矩阵A,行下标从a到b,列下标从c到d,本算法查找x是否在矩阵A中. {i=a; j=d; flag=0; //flag是成功查到x的标志 while(i<=b && j>=c) if(A[i][j]==x) {flag=1;break;} else if (A[i][j]>x) j--; else i++; if(flag) printf(“A[%d][%d]=%d”,i,j,x); //假定x为整型. else printf(“矩阵A中无%d 元素”,x); }算法search结束。