以下功能
rotate基于提醒(您是在“ mod”操作下表示此意思吗?)
这也是相当有效的。
// Helper function.// Finds GCD. // See http://en.wikipedia.org/wiki/Euclidean_algorithm#Implementationsint gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}// Number of assignments of elements in algo is// equal to (items.size() + gcd(items.size(),r)).void rotate(std::vector<int>& items, int r) { int size = (int)items.size(); if (size <= 1) return; // nothing to do r = (r % size + size) % size; // fits r into [0..size) int num_cycles = gcd(size, r); for (int first_index = 0; first_index < num_cycles; ++first_index) { int mem = items[first_index]; // assignment of items elements int index = (first_index + r) % size, index_prev = first_index; while (index != first_index) { items[index_prev] = items[index]; // assignment of items elements index_prev = index; index = (index + r) % size; }; items[index_prev] = mem; // assignment of items elements }}当然,如果如其他答案中所述适合更改数据结构,则可以获得更有效的解决方案。



