算法一:时间O(N),空间O(N)
利用额外的空间b[N]来直接定位到指定的位置,不需要考虑元素覆盖的问题,这是它快的原因
由于是循环右移,必然要%来循环,
核心代码:b[(i + k) % n] = a[i];
void move_it()
{
int n, k;
std::cout << "输入数组大小n,右移k位\n";
std::cin >> n >> k;
int* a = new int[n];
int* b = new int[n];
if (a == nullptr || b == nullptr)
{
std::cerr << "oom!" << std::endl;
exit(1);
}
else
{
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
for (int i = 0; i < n; i++) {
b[(i + k) % n] = a[i];
}
for (int i = 0; i < n; i ++ ) {
std::cout << b[i] << std::endl;
}
}
delete[] a;
delete[] b;
}
算法二:时间O(k*N),空间O(1)
思路先把保存第一个元素,末尾元素放到第一个位置,再把元素从左往右挪,每次移动1位
按这样的思路,做k次就能移动k位
void move_it()
{
int n, k;
std::cout << "输入数组大小n,右移k位\n";
std::cin >> n >> k;
int* a = new int[n];
if (a == nullptr )
{
std::cerr << "oom!" << std::endl;
exit(1);
}
else
{
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
while (k--) {
int begin = a[0];
a[0] = a[n - 1];
for (int i = n - 1; i >= 2; i--) {
a[i] = a[i - 1];
}
a[1] = begin;
}
for (int i = 0; i < n; i++) {
std::cout << a[i] << std::endl;
}
}
delete[] a;
}