标签: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