|
#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; |
|
恩,谢啦,我代码还是写的有点少
|
|