标签:leetcode
题意:给定一个数组,求该数组向右平移k个位置之后的数组,例如:[1,2,3,4,5,6,7] k = 3 => [5,6,7,1,2,3,4,5,6] public void rotate3(int [] nums, int k){//一次移动一个
if(k ==0 )return;
if(k > nums.length){
k = k % nums.length;
}
int temp = 0;
while (k -- > 0){
temp = nums[nums.length - 1];
System.arraycopy(nums, 0 ,nums,1,nums.length-1);
nums[0] = temp;
}
}
思路2:以空间换时间,把最後面的k字符复制到新数组的前面,然后复制其他部分,复杂度both时间和空间O(N)
代码2:
public void rotate2(int [] nums, int k){//开辟新数组
if(k ==0 )return;
if(k > nums.length){
k = k % nums.length;
}
int []rs = new int[nums.length];
int start = nums.length - k;
System.arraycopy(nums, start, rs, 0, k);
System.arraycopy(nums, 0, rs, k, rs.length - k);
System.arraycopy(rs, 0, nums,0, rs.length);
} public void rotate1(int [] nums, int k){//不断向右平移
if(k ==0 )return;
if(k > nums.length){
k = k % nums.length;
}
int front = 0;
int end = nums.length - k;
int temp;
int curLength = nums.length;
while (front < nums.length -1 ){
int nextK = 0;//下一个平移长度
if(k > curLength - k && curLength-k > 0){
nextK = k % (curLength -k);
if(nextK == 0)nextK = curLength - k;
} else if(curLength - k == 0){
return;
}else {
nextK = k;
};
for(int i =0; i < k; ++i){
if(front >= nums.length || end >= nums.length)break;
temp = nums[front];
nums[front] = nums[end];
nums[end] = temp;
front ++;
end ++;
}
if(front == nums.length -1) break;
curLength = curLength-k;
k = nextK ;
end = nums.length - k;
}
} public void rotate4(int [] nums, int k){//一次移动一个
if(k ==0 )return;
if(k > nums.length){
k = k % nums.length;
}
reverse(nums, 0, nums.length-1);
reverse(nums, 0, k-1);
reverse(nums, k, nums.length-1);
}
public void reverse(int [] nums, int start, int end){
int temp = 0;
while (start <= end){
temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start ++;
end --;
}
}标签:leetcode
原文地址:http://blog.csdn.net/youmengjiuzhuiba/article/details/44858373