編程之美2.17 數組迴圈移位,之美2.17

來源:互聯網
上載者:User

編程之美2.17 數組迴圈移位,之美2.17

      這是一個很經典的題目,題目的大概意思是這樣的:

      有一個儲存字串的數組,需要按照要求迴圈移動數組中的字元,例如,數組中儲存字元 abcd1234,迴圈右移4位,之後,會得到這樣一個字元數組 1234abcd,當然,左移也是同樣的解法

      想想這個問題不是很難,順序依次移動就可以了,這樣做的話,時間複雜度是O(n2)量級的,那麼,有沒有更快的方法呢?

      首先,我們需要對數組的前四位進行翻轉(前面的例子),得到dcba1234,之後,我們再對後4位進行翻轉,得到dcba4321,最後,我們再對整體進行翻轉,得到:1234abcd,就是這樣,解決了這個問題,由於翻轉一個字串需要的時間複雜度是O(n),所以,該演算法的時間複雜度是O(n)量級的。

      下面給出解決方案:      

template <typename T>void DutCircleShift(T* A, int size, int k){k %= size;DutReverse<T>(A, 0, size - k - 1);DutReverse<T>(A, size - k, size - 1);DutReverse<T>(A, 0, size - 1);}
/*翻轉函數*/template <typename T>void DutReverse(T* A, int low, int high){for (; low < high; ++low, --high){T temp = A[low];A[low] = A[high];A[high] = temp; }return;}

      代碼中的第一句代表如果輸入的那個數(即迴圈移動的數字)大於數組的長度,那麼,就對這個數按照數組長度取餘。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.