【easy】189. Rotate Array
题目标签:Array
题目给了我们一个数组 和 k。 让我们 旋转数组 k 次。
方法一:
这里有一个很巧妙的方法:
利用数组的length - k 把数组 分为两半;
reverse 左边和右边的数组;
reverse 总数组。
举一个例子:
1 2 3 4 5 6 7 如果k = 3 的话, 会变成 5 6 7 1 2 3 4
1 2 3 4 5 6 7 middle = 7 - 3 = 4,分为左边 4个数字,右边 3个数字
4 3 2 1 7 6 5 分别把左右reverse 一下
5 6 7 1 2 3 4 把总数组reverse 一下就会得到答案
public class Solution { public void rotate(int[] nums, int k) { if(nums == null || nums.length == 0 || k % nums.length == 0) return; int turns = k % nums.length; int middle = nums.length - turns; reverse(nums, 0, middle-1); // reverse left part reverse(nums, middle, nums.length-1); // reverse right part reverse(nums, 0, nums.length-1); // reverse whole part } public void reverse(int[] arr, int s, int e) { while(s < e) { int temp = arr[s]; arr[s] = arr[e]; arr[e] = temp; s++; e--; } } }
-----------------------------
方法二:
class Solution { public: void rotate(vector<int>& nums, int k) { //方法一:另设置一个vector,然后逐个元素添加进去,最后将这个vector赋值给nums。添加方式为将右边的k个元素添加进去,再将左边的n-k个元素添加进去。 if (nums.size() == 1) return; if (k > nums.size()) k %= nums.size(); vector<int> newNums; for (int i = nums.size() - k; i < nums.size(); ++i) newNums.push_back(nums[i]); for (int i = 0; i < nums.size() - k; ++i) newNums.push_back(nums[i]); nums = newNums; //方法二:自带的rotate函数 /* int len = nums.size(); if (len > 1) { k %= len; std::rotate(nums.begin(), nums.end() - k, nums.end()); } */ } };