右旋操作

Right rotation operation

int main()
{
    int shiftSteps, newposition;
    int numbers[10], numberscopy[10];
    cin >> shiftSteps;

    for (int i = 0; i < 10; i++)
        cin >> numbers[i];

    for (int i = 0; i < 10; i++)
        numberscopy[i] = numbers[i];

    //----------------------------------------

    for (int i = 0; i < 10; i++)
    {
        newposition = (i + shiftSteps) % 10;
        numbers[newposition] = numberscopy[i];
    }

     for (int i = 0; i < 10; i++)
        cout << numbers[i] << "  ";
}

我写这段代码是为了用辅助数组向右旋转 10 个数字 "numberscopy",但我想在没有辅助数组的情况下重写代码,但我不知道如何。

您可以就地旋转数组,即不使用带有 std::rotate 的辅助数组,这是一种标准算法。

std::rotate(numbers, numbers + shiftSteps, numbers + 10);

在没有辅助数组的情况下,可以利用反转算法通过“shiftSteps”来旋转数组。 它涉及以下三个步骤,

  • 将数组从 0 反转为 sizeOfArray-1
  • 将数组从 0 反转为 shiftSteps-1
  • 将数组从 shiftSteps 反转为 sizeOfArray-1

这是最终代码,

void reverseArray(int numbers[], int begin, int end) 
{ 
    while (begin < end) 
    { 
        swap(numbers[begin], numbers[end]); 
        begin++; 
        end--; 
    } 
} 

void rightRotate(int numbers[], int shiftSteps, int sizeOfArray) 
{ 
    reverseArray(numbers, 0, sizeOfArray-1);
    reverseArray(numbers, 0, shiftSteps-1);
    reverseArray(numbers, shiftSteps, sizeOfArray-1);
    
} 


int main()
{
    int shiftSteps;
    int numbers[10];
    cin >> shiftSteps;

    for (int i = 0; i < 10; i++)
        cin >> numbers[i];

    rightRotate(numbers, shiftSteps, 10);
 
    for (int i = 0; i < 10; i++)
        cout << numbers[i] << "  ";
}

Source 了解更多信息。