力扣题目:轮转数组
题目链接: 189.轮转数组
题目描述
代码思路
根据从轮转前到轮转后到数组变化,我们可以将数组元素分成两个部分,一个部分数轮转后从右边调到前面,一部分仅仅从左边向右移动。发现这个规律后,将数组分成两部分处理,即可解决问题。
代码纯享版
class Solution {
public void rotate(int[] nums, int k) {
int[] res = new int[nums.length];
int pos = 0;
k = k % nums.length;
for(int i = nums.length - k; i < nums.length; i++){
res[pos] = nums[i];
pos++;
}
for(int i = 0; i < nums.length - k; i++){
res[pos] = nums[i];
pos++;
}
for(int i = 0; i < nums.length; i++){
nums[i] = res[i];
}
}
}
代码逐行解析版
class Solution {
public void rotate(int[] nums, int k) {
int[] res = new int[nums.length]; //res数组用来保存更新后的数组
int pos = 0; //确定res更新的位置
k = k % nums.length; //取余防止出现k大于数组长度的情况
//第一个轮转后被 从后面调到前面的数字 的下标为nums.length - k
for(int i = nums.length - k; i < nums.length; i++){
res[pos] = nums[i]; //将轮转后放前面的部分赋值给res
pos++; //pos位置加一
}
//将只是单纯向右轮转的部分赋值给res
for(int i = 0; i < nums.length - k; i++){
res[pos] = nums[i];
pos++;
}
//将轮转后的完整数组拷贝到原数组中
for(int i = 0; i < nums.length; i++){
nums[i] = res[i];
}
}
}