杂技算法Java实现

将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转?(《编程珠玑》第二章)

“移动x[0]到临时变量t,然后移动x[i]至x[0],x[2i]至x[i],依此类推(将x中的所有下标对n取模),直至返回到取x[0]中的元素,此时改为从t取值然后终止过程。如果该过程没有移动全部元素,就从x[1]开始再次进行移动,直到所有的元素都已经移动为止。”遍历次数为GCD(n,i)

public static int GCD(int m, int n) {//辗转相除求最大公约数
		while (m % n != 0) {
			int temp = m % n;
			m = n;
			n = temp;
		}
		return n;
	}

	public static void acrobatics(int n, int i, int[] args) {
		int gcd = GCD(n, i);
		int current = 0, temp = 0;
		while (gcd >= 0) {
			temp = args[current];
			while (current + i < n) {
				args[current] = args[current + i];
				current = current + i;
			}
			args[current] = temp;
			current = (current + i) % (n - 1);
			gcd--;
		}
		for (int j = 0; j < args.length; j++)
			System.out.println(args[j]);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int[] a = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
		acrobatics(8, 4, a);
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值