#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
[show hint]
Related problem: Reverse Words in a String II
分析:等于将数组最右侧的元素旋转k次。记得之前有一种旋转ab要旋转为ba,a旋转变成A,b旋转变成b,
ba=(a-1 b-1)-1,旋转两部分,等于先各自将两部分各自旋转,然后整体旋转
k = k % n,将倒数k个元素
1 2 3 4 5 6 7
各自旋转
4 3 2 1 7 6 5
整体旋转
5 6 7 1 2 3 4
输入:
7(数组元素个数) 3(旋转k次)
1 2 3 4 5 6 7
7 10
1 2 3 4 5 6 7
7 7
1 2 3 4 5 6 7
输出:
5 6 7 1 2 3 4
5 6 7 1 2 3 4
1 2 3 4 5 6 7
*/
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.empty() || k < 0)
{
return;
}
int size = nums.size();
k = k % size;
if(0 == k)
{
return;
}
//将0到n-k-1旋转,将n-k到n-1旋转,最后一个数取不到
reverse(nums.begin() , nums.begin() + size - k);
reverse(nums.begin() + size - k , nums.end());
reverse(nums.begin() , nums.end());
}
};
void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}
void process()
{
vector<int> nums;
int value;
int num;
Solution solution;
vector<int> result;
int k;
while(cin >> num >> k)
{
nums.clear();
for(int i = 0 ; i < num ; i++)
{
cin >> value;
nums.push_back(value);
}
solution.rotate(nums , k);
print(nums);
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
leecode 解题总结:189. Rotate Array
最新推荐文章于 2023-05-20 12:12:54 发布