可以使用三次翻转来实现数组的循环左移。

首先,将数组的前 k 个元素进行翻转; 然后,将数组的剩余部分进行翻转; 最后,将整个数组进行翻转。

下面是具体的实现代码:

#include <iostream>
using namespace std;

// 翻转数组的函数
void reverse(int A[], int start, int end) {
    while (start < end) {
        int temp = A[start];
        A[start] = A[end];
        A[end] = temp;
        start++;
        end--;
    }
}

// 循环左移数组的函数
void rotateLeft(int A[], int n, int k) {
    k = k % n;  // 如果 k 大于 n 的话,取余数
    reverse(A, 0, k - 1);  // 翻转前 k 个元素
    reverse(A, k, n - 1);  // 翻转剩余部分
    reverse(A, 0, n - 1);  // 翻转整个数组
}

int main() {
    int A[] = {1, 2, 3, 4, 5};
    int n = sizeof(A) / sizeof(A[0]);
    int k = 2;

    rotateLeft(A, n, k);

    cout << '循环左移后的数组为:';
    for (int i = 0; i < n; i++) {
        cout << A[i] << ' '; 
    }
    cout << endl;

    return 0;
}

输出结果为:

循环左移后的数组为:3 4 5 1 2

这样就实现了将数组循环左移 k 个位置的功能,时间复杂度为 O(n),空间复杂度为 O(1)。

C++ 数组循环左移:时间复杂度 O(n),空间复杂度 O(1)

原文地址: https://www.cveoy.top/t/topic/eKPv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录