编程之美-2.17 数组移位循环
2017-04-20 15:43
253 查看
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
方法:
将数组A(含N个元素)右移K位,相当于把A分为两部分,前(N-K)个元素A1和后K个元素A2,右移的过程是将两部分交换位置,即原A=A1 A2,移位后为A'=A2 A1,A1,A2内部的元素顺序是不变的。因此具体实现可通过以下步骤完成:先将A的元素全部逆序排列(A2的元素放到A1的前面,但A1,A2内部元素是逆序的,因此需要后面再次逆转一次),再分别将前K个元素和后(N-K)个元素逆序排列。
注意:K<0,表示左转|K|位,(若|K|<N,相当于右移(N-K)位)
K>N, 相对于移动(K%N)位。
实现代码如下:
#include <vector>
using namespace std;
template<class Type>
void Reverse(vector<Type>&v, int start, int end)
{
for (; start < end; start++, end--)
{
Type temp = v[start];
v[start] = v[end];
v[end] = temp;
}
return;
}
template<class Type>
void RightShiftKNum(vector<Type> &v, int K)
{
int len = v.size();
if (len == 0)
return;
if (K>len )
K %= len;
else if (K < -len)
K = len - (-1 * K) % len;
else if (K < 0)
K = len + K;
Reverse(v, 0, len - 1);
Reverse(v, 0, K-1);
Reverse(v, K,len-1);
return;
}
int main(void)
{
vector<char> v = { 'a', 'b', 'c', 'd', '1', '2', '3', '4'};
RightShiftKNum(v, -11);
return 0;
}
方法:
将数组A(含N个元素)右移K位,相当于把A分为两部分,前(N-K)个元素A1和后K个元素A2,右移的过程是将两部分交换位置,即原A=A1 A2,移位后为A'=A2 A1,A1,A2内部的元素顺序是不变的。因此具体实现可通过以下步骤完成:先将A的元素全部逆序排列(A2的元素放到A1的前面,但A1,A2内部元素是逆序的,因此需要后面再次逆转一次),再分别将前K个元素和后(N-K)个元素逆序排列。
注意:K<0,表示左转|K|位,(若|K|<N,相当于右移(N-K)位)
K>N, 相对于移动(K%N)位。
实现代码如下:
#include <vector>
using namespace std;
template<class Type>
void Reverse(vector<Type>&v, int start, int end)
{
for (; start < end; start++, end--)
{
Type temp = v[start];
v[start] = v[end];
v[end] = temp;
}
return;
}
template<class Type>
void RightShiftKNum(vector<Type> &v, int K)
{
int len = v.size();
if (len == 0)
return;
if (K>len )
K %= len;
else if (K < -len)
K = len - (-1 * K) % len;
else if (K < 0)
K = len + K;
Reverse(v, 0, len - 1);
Reverse(v, 0, K-1);
Reverse(v, K,len-1);
return;
}
int main(void)
{
vector<char> v = { 'a', 'b', 'c', 'd', '1', '2', '3', '4'};
RightShiftKNum(v, -11);
return 0;
}
相关文章推荐
- 编程之美 2.17 数组循环移位
- 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello
- [编程之美] PSet2.17 数组循环移位
- 读书笔记之编程之美 - 2.17 数组循环移位
- 编程之美 2.17 数组循环移位
- 编程之美 2.17 数组循环移位
- 编程之美-2.17-数组循环移位
- 编程之美2.17——数组循环移位
- 编程之美2.17——数组循环移位——解法…
- 编程之美 数组循环移位
- 编程之美2.17 数组循环移位
- 2.17 数组循环移位
- 【编程之美】2.17 数组循环位移
- 2.17 数组循环移位
- 编程之美读书笔记_2.17 数组循环移位
- 编程之美2.17 数组循环移位
- 每天学习一点编程(14)(数组/字符串循环移位)
- 《编程之美》读书笔记09: 2.17 数组循环移位
- 编程之美---数组循环移位
- 编程之美-数组循环移位