/*
* 需求:旋转数组
* 需求:旋转数组
* Rotate an array of n elements to the right by k steps.
*/
在自己的eclipse上写的代码很通过,但是在leetcode上怎么也刷不过。编译能过,但是输出的还是原来的数组,并没有旋转。
睡了一觉,才想到是这个原因。
是因为数组与数组之间的拷贝不能直接用"="号来赋值,nums只是引用,当nums=y;的时候,nums只是指向别的对象,原来的对象内容并没有改变。所以要改用
System.arraycopy()或者是Arrays.copyof()来拷贝数组。
当然这两者还是有区别的。具体请参考API。
贴代码:
/*<span style="font-size:18px;">
* 时间复杂度和空间复杂度都是O(N)
* 开辟一个新数组区域
* 倒着找到要旋转的区域,输出,
* 在正着找到没有旋转的地方,输出
*/
public void rotate(int[] nums, int k) {
int reallyrotate=k%(nums.length);//循环,实际只旋转k%len次数
int start=nums.length-reallyrotate;
int end=nums.length-1;//确定待变换区域
if(start<=end){
int[] y=new int[nums.length];
int y_cur = 0;
//赋值旋转区域
for(int i=start;i<=end;i++){
y[i-nums.length+reallyrotate]=nums[i];//y[0]=num[i]
y_cur=i-nums.length+reallyrotate;
}
System.out.println("y_cur="+y_cur);
//赋值没有旋转区域
for(int j=0;j<=nums.length-reallyrotate-1;j++)
{
y[y_cur+1+j]=nums[j];
}
System.arraycopy( y, 0, nums, 0, nums.length );//拷贝数组
System.out.println(Arrays.toString(nums));
}
}</span>