class Solution
{
//为了使得空间为O(1),不能用API
void reverse(int[] nums, int l, int r)
{
while (l < r)
{
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
++l;
--r;
}
}
public void rotate(int[] nums, int k)
{
int n = nums.length;
k %= n;//轮转n后,就是原数组,所以实际轮转是k%n
reverse(nums, 0, n - 1);//翻转整个数组
reverse(nums, 0, k - 1);//翻转前半段
reverse(nums, k, n - 1);//翻转后半段
}
}
2. 环状替换
class Solution
{
public void rotate(int[] nums, int k)
{
int n = nums.length;
k %= n;//轮转n后,就是原数组,所以实际轮转是k%n
if (k == 0) return;
// count用于计数,确保每个位置都被修改
for (int startId = 0, count = 0, curId = startId, curNumber = nums[curId]; count < n; ++count)
{
int nextNumber = nums[(curId + k) % n];// 作为临时变量,存储被修改之前的内容
nums[(curId + k) % n] = curNumber;// 交换
curNumber = nextNumber;
curId = (curId + k) % n;
// 判断并更新参数
if (curId == startId)//若k>1, 新起点就是前面跳过的点
{
++startId;
// 此处要更新新的curId和curNumber
curId = startId;
curNumber = nums[curId];
}
}
}
}