【408算法】2010 循环左移数组

79 阅读1分钟

题目

设将 n (n>1) 个整数放置到一维数组 R 中,试设计一个在时间和空间两方面都尽可能高效的算法.将 R 中保存的序列循环左移 p(0<p<n) 个位置,即将 R 中的数据由 (X0,X1,...Xn-1)变换为(Xp,Xp+1,...Xn-1,X0,X1...Xp-1)

要求:

1)给出算法的基本设计思想

2)根据设计思想,采用C,C++ 或 Java 语言描述算法,关键之处给出注释

3)说明你所设计算法的时间复杂度和空间复杂度

思路

倒置数组,将数组从头到尾逆置一遍,再从 1 到 p 和 p+1 到 n 再分别逆置

时间复杂度: O(n)

空间复杂度: O(1)

核心算法(C++)

#include <cstdio>
#include <cstdlib>


// 倒置数组
void reverse(int* &L, int l, int r){
    for (int i = 0; i < (r - l + 1) / 2; i++) {
        int temp = *(L + (l - 1) + i);
        *(L + (l - 1) + i) = *(L + (r - 1) - i);
        *(L + (r - 1) - i) = temp;
    }
}

void ans(int* &L, int p, int n) {
    reverse(L, 1, n);
    reverse(L, 1, p);
    reverse(L, p + 1, n);
}


//==============以下为测试==================
const int n = 6;
int main() {
    // 生成测试数据
    int* R;
    R = (int*)malloc(sizeof(int) * n);
    for (int i = 0; i < n; i++) {
        *(R + i) = i + 1;
    }
    // 调用逆转
    int p = 2;
    ans(R, p, n);
    for (int i = 0; i < n; i++) {
        printf(" %d ", *(R + i));
    }

    return 0;
}