0
点赞
收藏
分享

微信扫一扫

[数组]BM97 旋转数组-简单

知识点​​数组​​

描述

一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

数据范围:[数组]BM97 旋转数组-简单_数组[数组]BM97 旋转数组-简单_数组反转_02进阶:空间复杂度 [数组]BM97 旋转数组-简单_数组反转_03,时间复杂度 [数组]BM97 旋转数组-简单_数组_04

示例1

输入:

6,2,[1,2,3,4,5,6]

复制返回值:

[5,6,1,2,3,4]

复制

示例2

输入:

4,0,[1,2,3,4]

复制返回值:

[1,2,3,4]

题解

三次反转法


#include <bits/stdc++.h>

using namespace std;

vector<int> solve(int n, int m, vector<int> &a)
{
m = n - m % n;
std::reverse(a.begin(), a.begin() + m);
std::reverse(a.begin() + m, a.end());
std::reverse(a.begin(), a.end());
return a;
}

暴力位移法

每次将最末尾的一个元素移动到第一个,然后将剩下的元素往后移动一格。

void shift(vector<int> &v)
{
if (v.size() <= 1)
{
return;
}

int a = v.back();
for (int i = v.size() - 1; i > 0; --i)
{
v[i] = v[i - 1];
}
v[0] = a;
return;
}

vector<int> solve_2(int n, int m, vector<int> &a)
{
m = m % n;
for (int i = 0; i < m; ++i)
{
shift(a);
}
return a;
}

使用额外的数组

使用额外的数组,只需要将原来末尾的m的数放到新数组开头,然后再将剩余的数往后追加即可。

代码从略~


举报

相关推荐

0 条评论