题目的链接在这里:https://leetcode-cn.com/problems/rotate-array/
题目大意
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。一、示意图
二、解题思路
双指针 三次反转
双指针(会超时)
代码如下:
class Solution {
public void rotate(int[] nums, int k) {
//用栈肯定是可以的 但是太复杂 就算了 其实就相当于是 第一个指针指向倒数第k个 然后记录这个值 然后把其他的值往后移一个 然后也进行替换
//第一个指针指向起点 第二个指针指向第一个需要移动的位置
//先进行边界判断
if (nums.length==1){
return;
}
int left=0;
//就直接等于最右边这个数
int right=nums.length-1;
//然后要移动k次
while (k-->0){
//先记录这个位置
int temp=nums[right];
//然后left开始集体往后移动
for(int i=right;i>left;i--){
nums[i]=nums[i-1];
}
//然后把left也进行置换
nums[left]=temp;
//然后把left和right都向前移动 但是这个向前移要取余
left=(left++)%(nums.length);
right=(right++)%(nums.length);
}
}
}
三次反转
代码如下:
class Solution {
public void rotate(int[] nums, int k) {
//进行三次反转
int n=nums.length;
//这里要对k进行取余
k=k%(n);
revers(nums,0,n-1);
revers(nums,0,k-1);
revers(nums,k,n-1);
}
private void revers(int[] nums, int left, int right) {
//这个就是进行三次反转
for(int i=left,j=right;i<j;i++,j--){
//然后就开始反转
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}