| 
 #include <iostream> void rotate(int* nums, int numsSize, int k) for (int i=0;i<numsSize;i++) for (int i=0;i<numsSize;i++) } 我在VS2010输出是 2 1 啊,可是提交后说输出是 1 2  | 
|
#include <iostream>
#include<malloc.h>
using namespace std;
void rotate(int* nums, int numsSize, int k)
{
	int j=k-1,m=k-1;
	int *temp =(int *)malloc(k*sizeof(int));
	if (numsSize<k)
	{
		k=numsSize;
	}
	for (int i=numsSize-1;i>=(numsSize-k);i--)
	{
		temp[j]=nums[i]; cout<<temp[j]<<"   ";
		j--;
	}
	cout<<endl;
	for (int i=0;i<numsSize;i++)
	{
		if(i<numsSize-k)
		{
			nums[numsSize-i-1]=nums[numsSize-k-1-i];
		}
		else 
		{
			nums[numsSize-i-1]=temp[m];
			m--;
		}
	}
	for (int i=0;i<numsSize;i++)
	{
		cout<<nums[i]<<"  ";
	}
}
 
int main()
{
	int nums[]={1,2};  
	int numsSize=2,k=3;
	rotate(nums,numsSize,k);
	return 0;
}
 | 
|
| 10分 | |
| 10分 | 
 
我的代码,时间复杂度O(n),空间复杂度O(1)
 
void rotate(int* nums, int numsSize, int k) {
    k%=numsSize;
    if(k) {
        int cur,last,i,j,index;
        int gcd=numsSize,b=k;
        while(b) {
            i=gcd;
            gcd=b;
            b=i%b;
        }
        b=numsSize/gcd;
        for(i=0;i<gcd;++i)
            for(j=b,index=i,last=nums[i+numsSize-k];j>0;--j) {
                cur=nums[index];
                nums[index]=last;
                index+=k;
                if(index>=numsSize)index-=numsSize;
                last=cur;
            }
    }
}
 | 
| 20分 | 
 
问题在于Rotate是循环,k=3应该相当于数组的元素在一个大小为2的环形数组中右移三格,也就是转了一圈半,即应为k=1,而你的代码中
 
if (numsSize<k)
{
    k=numsSize;
}
应改为 k%=numsSize;  | 
| 
 
恩,谢啦,我代码还是写的有点少 
 | 
|