如何使用数组进行两次循环移位

时间:2014-03-20 05:48:47

标签: c++ arrays

我正在编写一个程序,将此代码中的数组移动两个,例如,a [5] = {0,1,2,3,4}并输出{3,4,0 ,1,2}我已经编写了代码,但是我错过了一些东西......感谢任何帮助!

#include <iostream>

using namespace std;

void circularShift(int a[], int size)
{

    for (int i = size-2; i >=0; i--)
    {
        int temp = a[i+1];
        a[i+1] = a[i];
    }
}

int main()
{
    int a[5] = {0,1,2,3,4};
    int size = 5;

    circularShift(a, 5);

    for (int i=0; i < size; i++)
    {
        cout << a[i]<< " ";
    }
    return 0;
}

6 个答案:

答案 0 :(得分:0)

试试这个 -

void circularShift(int a[], int size)
{
   int tmp = a[0];
   for (int i = 0; i < size-1 ; i++)
   {
       a[i]=a[i+1];
   }
   a[size-1] = tmp; 
}

答案 1 :(得分:0)

你的功能不对:

  1. 它在第一次迭代中访问a[5]
  2. 如果您需要向右移动两次,则需要计算元素的新索引:

    newIndex = (oldIndex+2)%5

    它将确保您在阵列中进行循环移位。

答案 2 :(得分:0)

void circularShift(int a[], int size)
{
    int tmp1 = a[size - 1];
    int tmp2 = a[size - 2];
    for (int i = size-3; i >=0; i--)
    {
        a[i+2] = a[i];
    }
    a[1] = tmp1;
    a[0] = tmp2;
}

答案 3 :(得分:0)

虽然它是高度复杂的方法,但它仍然适用于您的问题。

#include <iostream>

using namespace std;

void circularShift(int a[], int size)
{
    int no;
    int rotate_no = 2;
    for(int j=0; j<rotate_no; j++)
    {
        no = a[size-1];
        for (int i=0 ; i<size ; i++)
        {
            int temp = a[i];
            a[i] = no;
            no = temp;
        }
    }
}

int main()
{
    int a[5] = {0,1,2,3,4};
    int size = 5;

    circularShift(a, 5);

    for (int i=0; i < size; i++)
    {
        cout << a[i]<< " ";
    }
    return 0;
}

答案 4 :(得分:0)

试试这个

void circularShift(int a[], int size, int rotations)
{
  int temp = a[0];
  for (int i = 0; i <size; i++)
  {
      int temp1 = a[((i+1)*rotations)%size];
      a[((i+1)*rotations)%size] = temp;
      temp = temp1;
  }
}

答案 5 :(得分:0)

使用stl:https://ideone.com/Zd3hu4

void circularShift(int a[], int size)
{
    assert(size >= 2);
    std::rotate(a, a + size - 2, a + size);
}