翻转数组
题目
给定一个含有N个数的数组循环向右移K位(k>0) 例如abcd1234–>1234abcd
方法一:遍历求解法
思路:很容易想到把前面的数向后面移动保存需要移动到前面的数例如:abcd1234->4abcd123while一直循环直到k小于0,时间复杂度为O(N*K)
代码实现:
/**
* 思路:把前面的数向后移位
* @param arr
* @param k
*/
public static void arrayNumCyclicShift(int [] arr,int k){
if(arr==null || arr.length==0) return;
//定义一个变量保存需要移动的值
int temp,i;
while (k>0){
temp=arr[arr.length-1];
for (int j = arr.length-1; j >0; j--) {
arr[j]=arr[j-1];
}
arr[0]=temp;
k--;
}
}
方法二:交换法
思路:把数组拆分成两个数组 abcd1234–>1234abcd 先把abcd翻转dcba 后1234 4321 最后把dcba4321翻转成1234abcd
public static void arrayNumCyclicShift1(int [] arr,int start,int end){
while (start<end){
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
start++;
end--;
}
}
测试代码:
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5,6,7,8};
System.out.print("翻转前:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
System.out.println();
arrayNumCyclicShift(arr,4);
System.out.print("翻转后:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
int len=arr.length;
int k=4;
arrayNumCyclicShift1(arr,0,len-k-1);
arrayNumCyclicShift1(arr,len-k,len-1);
arrayNumCyclicShift1(arr,0,len-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
结果: