1、题目:不增加空间的情况下,将数组的后k位整体移到前面。
例如:1,2,3,4,5,6。当k=2时,移动结果是5,6,1,2,3,4。k=3时,6,5,4,1,2,3......
这是昨天实验室师兄面试百度时的一道题目,要求是给定20分钟写出代码
2、解法1:设数组大小为n,先保存a[n-k+i],然后将不用移动的n-k个元素后移:
for(i=0;i<k2;i++){
int t=a[n-k+i];
for(j=0;j<n-k;j++){
a[n-k+i-j]=a[n-k+i-j-1];
}
a[i]=t;
}
3、解法2:
思路:
A、将k个元素看成一个块,逐步的往前移动;
B、当n-k%k!=0时,又回到题目的原始状况,使用递归即可。
例如:
a情况、n-k%k=0:
1,2,3,4,5,6,7,8,k=2
交换第1次后:1,2,3,4,7,8,5,6
交换第2次后:1,2,7,8,3,4,5,6
交换第3次后:7,8,1,2,3,4,5,6
上面的步骤可以用一次循环实现
for(int i=n-1;i<=k;i++){
swap(a[i],a[i-k])
}
b情况n-k%k!=0:
1,2,3,4,5,6,7,8,9,10,k=3
交换到1,8,9,10,2,3,4,5,6,7时,无法将8,9,10整体交换,将10和1交换后,还需将8,9交换到10的前面,即此时的情况为做n=k,k=k-(n-k)%k,进行递归即可
private static void trans(int []a,int n,int k){
for(int i=n-1;i>=k;i--)
swap(a,i,i-k);
if((n-k)%k==0)
return ;
else
trans(a,k,k-(n-k)%k);
}