知识点数组
描述
一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
数据范围:,
进阶:空间复杂度
,时间复杂度
示例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]
题解
三次反转法
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的数放到新数组开头,然后再将剩余的数往后追加即可。
代码从略~