移动数组的子序列
要求:已知一个数组A[m+n]中依次存放着两个序列(a1,...am)和(b1,...bn),试着写一个函数,将数组中的两个序列的位置互换,即将(b1,...bn)放在(a1,...am)的前面。
思路:
先将数组中的全部元素原地逆置,再对前n个元素和后m个元素分别使用逆置算法,就可以得到该序列
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 void Reverse(int a[],int left,int right) 7 { 8 if(left>=right) 9 return ; 10 int mid=(left+right)/2; 11 for(int i=0;i<=mid-left;i++) 12 { 13 int temp=a[left+i]; 14 a[left+i]=a[right-i]; 15 a[right-i]=temp; 16 } 17 } 18 19 void Exchange(int a[],int m,int n) 20 { 21 Reverse(a,0,m+n-1); 22 Reverse(a,0,n-1); 23 Reverse(a,n,m+n-1); 24 } 25 26 int main() 27 { 28 int a[100]; 29 int n,m; 30 scanf("%d%d",&m,&n); 31 printf("请输入数组前%d个元素:\n",m); 32 int i=0; 33 for(i=0;i<m;i++) 34 scanf("%d",&a[i]); 35 printf("请输入数组后%d个元素:\n",n); 36 for(;i<n+m;i++) 37 scanf("%d",&a[i]); 38 39 Exchange(a,m,n); 40 41 printf("颠倒后的元素:\n"); 42 for(i=0;i<n+m-1;i++) 43 printf("%d ",a[i]); 44 printf("%d\n",a[n+m-1]); 45 return 0; 46 }
要求2:
设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0﹤P﹤n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1 ……Xp-1)
思路:例如字符串abcdefgh
(1):ab->a-1b; //cbadefgh
(2):a-1b->a-1b-1//cbahgfed
(3):(a-1b-1)-1->ba//defghabc
代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 void Reverse(int a[],int from,int to) 7 { 8 if(to>=from) 9 return ; 10 int mid=(to-from+1)/2; 11 for(int i=0;i<mid;i++) 12 { 13 int temp=a[from+i]; 14 a[from+i]=a[to-i]; 15 a[to-i]=temp; 16 } 17 } 18 19 void Converse(int a[],int len,int p) 20 { 21 Reverse(a,0,p-1); 22 Reverse(a,p,len-1); 23 Reverse(a,0,len-1); 24 } 25 26 int main() 27 { 28 int a[100]; 29 int n,m; 30 scanf("%d",&m); 31 printf("请输入%d个元素:\n",m); 32 for(int i=0;i<m;i++) 33 scanf("%d",&a[i]); 34 printf("请输入需要移动的单位长度:\n"); 35 int p; 36 scanf("%d",&p); 37 38 Converse(a,m,p); 39 40 printf("移动后的元素:\n"); 41 for(int i=0;i<m-1;i++) 42 printf("%d ",a[i]); 43 printf("%d\n",a[m-1]); 44 return 0; 45 }

浙公网安备 33010602011771号