#10757. 数组第一题(NOIP2013)序列重排

数组第一题(NOIP2013)序列重排

第一题(NOIP2013序列重排)

全局数组变量定义如下:

const int SIZE = 100;
int a[SIZE], n;

功能:将序列 a 的前 p 个数与后 n-p 个数对调,不改变内部相对顺序。例如序列 1,2,3,4,5,p=2 时重排为 3,4,5,1,2。

有一种朴素的算法可以实现这一需求,其时间复杂度为O(n),空间复杂度为O(n):

void swap1(int p){
    int i,j,b[SIZE];
    for (i=1;i<=p;i++)
    b[  ①  ]=a[i];
    for (i=p+1;i<=n;i++)
    b[i-p]=  ②  ;
    for (i=1;i<=  ③  ;i++)
    a[i]=b[i];
}

我们也可以用时间换空间,使用时间复杂度为O(n²),空间复杂度为O(1)的算法:

void swap2(int p){
    int i,j,temp;
    for (i=p+1;i<=n;i++) {
    temp=a[i];
    for (j=i;j>=  ④  ;j--)
    a[j]=a[j-1];
    ⑤  =temp;
    }
}

●选择题
(1)①处应填( )。
{{ select(1) }}

  • p+i
  • n-p+i
  • n-p+i-1
  • i

(2)②处应填( )。
{{ select(2) }}

  • a[i]
  • a[i-p]
  • a[n-i]
  • b[i]

(3)③处应填( )。
{{ select(3) }}

  • n
  • p
  • p+1
  • n-1

(4)④处应填( )。
{{ select(4) }}

  • 1
  • i-p
  • n-i
  • i-p+1

(5)⑤处应填( )。
{{ select(5) }}

  • a[i-p+1]
  • a[i]
  • a[i-p]
  • a[i-1]