不增加空间的情况下,将数组的后k位整体移到前面

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);
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值