2.17 数组循环移位

2.17 数组循环移位

基础问题:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为\(O(n)\),且只允许使用两个附加变量。

解法

  • 解法 1 : 暴力求解
    abcd1234 ---> 4abcd123 ---> 34abcd12 --->234abcd1 ---> 1234abcd
    时间复杂度为\(O(n*k)\),空间复杂度为\(O(1)\)
  • 解法 2 :观察规律,通过翻转来实现移位操作
    abcd1234 ---> dcba1234 ---> dcba4321 ---> 1234abcd
    时间复杂度为\(O(n)\),空间复杂度为\(O(1)\)

all coding

// 2.17 数组循环移位
class Test{
	public static void main(String[] args) {
		/**
		基础问题:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为$O(n)$,且只允许使用两个附加变量。
		abcd1234 ---> 4abcd123 ---> 34abcd12 --->234abcd1 ---> 1234abcd
		> 解法
			- 解法 1 : 暴力求解
				时间复杂度为$O(n*k)$,空间复杂度为$O(1)$
			- 解法 2 :观察规律,通过翻转来实现移位操作
				abcd1234 ---> dcba1234 ---> dcba4321 ---> 1234abcd
			 	时间复杂度为$O(n)$,空间复杂度为$O(1)$
		*/
		char[] arr = new char[]{'a','b','c','d','1','2','3','4'};
		print(arr);
		moveKth2(arr,2);
	}
	/**
	打印字符数组
	*/
	public static void print(char[] arr){
		for(char c:arr) System.out.print(c+" ");
		System.out.println();
	}
	/**
	方法1:暴力求解
	*/
	public static void moveKth1(char[] arr,int k){
		k %=arr.length;
		while(k-->0){
			char tmp = arr[arr.length-1];
			for(int i = arr.length-1;i>0;i--) arr[i] = arr[i-1];
			arr[0] = tmp;
		}
		print(arr);

	}
	/**
	方法2:观察规律,通过翻转来实现移位操作
	*/
	public static void moveKth2(char[] arr,int k){
		k%=arr.length;
		reverse(arr,0,arr.length-k-1);
		reverse(arr,arr.length-k,arr.length-1);
		reverse(arr,0,arr.length-1);
		print(arr);

	}
	public static void reverse(char[] arr,int start,int end){
		while(start < end){
			char temp = arr[start];
			arr[start] = arr[end];
			arr[end] = temp;
			start++;
			end--;
		}
	}
}
posted @ 2020-11-24 13:48  BOTAK  阅读(121)  评论(0编辑  收藏  举报