PAT BASIC 1008

思路:

這個題題意表達得可能沒那麼清楚,如果說要求只能開O(N)的數組,時間複雜度也是O(N),那就是一個比較有趣的題。

我們可以用三次反轉的方法來思考這個題。

如果說我要把xy這個字符串的y字串移到x子串的左邊,變成yx,我記x^T爲將x反轉,如果x=”abc”,那麼x^T=”cba”。

這樣,這裏就有一個比較有意思的式子了

yx=(x^T y^T)^T

也就是說我們只需要進行三次反轉,就可以實現我的操作。時間複雜度爲6N,即O(N)

代碼:

#include<iostream>
using namespace std;
int num[100];
int n, m;
void reverse(int left, int right);

void reverse(int left, int right)
{
  int i, t;
  for (i = left; i <= (left + right) / 2; i++)
  {
    t = num[i];
    num[i] = num[left + right - i];
    num[left + right - i] = t;
  }
}

int main()
{
  int count = 0, pos = 0;
  int i, j, t;
  cin >> n >> m;
  m = m%n;
  for (i = 0; i < n; i++)
    cin >> num[i];
  reverse(0, n - m - 1);
  reverse(n - m, n - 1);
  reverse(0, n - 1);
  for (i = 0; i < n - 1; i++)
    cout << num[i] << " ";
  cout << num[n - 1];
  //while (1)
  //{
  //}
  return 0;
}
發佈了37 篇原創文章 · 獲贊 0 · 訪問量 5077
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章