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--;
}
}
}
Saying Less Doing More