移动数组的子序列

     要求:已知一个数组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 } 
View Code

   要求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 } 
View Code

 

posted @ 2016-07-03 15:44  太过随意  阅读(114)  评论(0)    收藏  举报