#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 77 101 2 3 4 5 6 77 71 2 3 4 5 6 7输出:5 6 7 1 2 3 45 6 7 1 2 3 41 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;}
新闻热点
疑难解答