返回

旋转数组--C语言经典面试题

见解分享

简介

旋转数组,又称环形数组,是一个将数组中元素循环移动一定次数后的数组。它是许多编程面试中的常见问题,因为它需要对数组操作和数据结构有良好的理解。本文将探讨 C 语言中旋转数组的经典实现方法,重点关注三步翻转法。

三步翻转法

三步翻转法是一种将数组旋转 n 次的有效算法,它通过以下三个步骤完成:

  1. 翻转整个数组: 将数组中所有元素从头到尾翻转。
  2. 翻转数组的前 n 个元素: 将数组中前 n 个元素翻转。
  3. 翻转数组中剩下的元素: 将数组中从第 n + 1 个元素到尾部的元素翻转。

算法步骤

以下是使用三步翻转法旋转数组的 C 语言代码:

void rotateArray(int* nums, int numsSize, int k) {
    // 边界情况检查
    if (nums == NULL || numsSize == 0) {
        return;
    }

    // 计算旋转的实际次数
    k = k % numsSize;
    if (k < 0) {
        k += numsSize;
    }

    // 旋转整个数组
    reverseArray(nums, 0, numsSize - 1);

    // 旋转数组的前 k 个元素
    reverseArray(nums, 0, k - 1);

    // 旋转数组中剩下的元素
    reverseArray(nums, k, numsSize - 1);
}

// 翻转数组中指定范围的元素
void reverseArray(int* nums, int start, int end) {
    while (start < end) {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

示例

考虑以下示例,其中数组 nums[1, 2, 3, 4, 5, 6, 7],旋转次数 k 为 3:

  1. 翻转整个数组: [7, 6, 5, 4, 3, 2, 1]
  2. 翻转数组的前 3 个元素: [5, 6, 7, 4, 3, 2, 1]
  3. 翻转数组中剩下的元素: [5, 6, 7, 1, 2, 3, 4]

因此,旋转后的数组为 [5, 6, 7, 1, 2, 3, 4]

优点和缺点

三步翻转法的优点在于:

  • 效率: 它是一种快速且高效的旋转数组方法。
  • 空间复杂度低: 该算法只需要常数级别的额外空间。

该方法的缺点在于:

  • 重复翻转: 需要进行多次翻转,这可能会增加算法的时间复杂度。
  • 不适用于极端情况: 如果旋转次数非常大(接近数组长度),该算法的效率会降低。

其他方法

除了三步翻转法外,还有其他旋转数组的方法,例如:

  • 一次翻转法: 通过将数组划分为两个部分并一次翻转来旋转数组。
  • 块翻转法: 通过将数组划分为大小相等的块并逐个翻转这些块来旋转数组。

选择方法

选择哪种旋转数组的方法取决于特定问题的要求和数组的特性。三步翻转法通常是旋转次数较小且数组长度较短情况下的一个不错的选择。

结论

旋转数组是面试中经常遇到的一个问题。本文讨论了使用三步翻转法在 C 语言中旋转数组的经典实现方法。这种方法是一种快速且高效的算法,但也有其自身的优点和缺点。了解不同的旋转数组方法对于解决面试问题和编写高效的代码至关重要。