[Java]数组循环位移

本文探讨了两种Java实现数组循环位移的方法,包括将数组分为两部分逆序的策略和通过递归调整元素顺序的方法,确保在O(n)的时间复杂度内完成操作。
摘要由CSDN通过智能技术生成

数组[n-1], 循环位移k位, 时间复杂度O(n)

方法A, 此算法的设计思路是什么呢?

1) 分为0 ~ k, k ~ n-1 两部分, 分别逆序

2) 0 ~ n-1 逆序

public class ArrayShift {

	static public void shift(Object[] ary, int k) {
		int n = ary.length;
		k = k % n;
		if(k < 0)
			k = k + n;
		reverse(ary, 0, n - k - 1);
		reverse(ary, n - k, n - 1);
		reverse(ary, 0, n - 1);

	}

	static void reverse(Object[] ary, int start, int end) {
		Object t;
		for (; start < end; start++, end--) {
			t = ary[start];
			ary[start] = ary[end];
			ary[end] = t;
		}
		
	}
	
}

方法B, 自己胡乱想的,是否符合时间复杂度要求?

1) 假设右移k位, 则将数组A 最末的k个元素与 0 ~ k 交换,使得0 ~ k位置顺序符合要求, 并得到 A[k+1] , A[k+2] ..... A[1], A[2] ... A[k] 组成的长度为n-k的数组A‘

2) 如果A‘长度小于k, k = k % A.length;

3) A’ 位移k位, 递归至数组长度0 或 k = 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值