一、问题描述
功能描述:数组的循环移位,
输入:{a,b,c},2
输出:{b,c,a}
要求实现方法:
/**
*data :待循环数组
*index:移动位数
*/
public String[] getChildren(String[] data,int index)
{
//TODO
return null;
}
二、算法分析
考虑一下数组A中元素123456循环右移2位到, 可以将数组A分成两个部分:A[0~n-k-1] 和 A[n-k~n-1] ,将这两个部分分别翻转,然后放在一起在翻转(逆序)。具体是这样的:
在上面例题中,n = 3, k = 2, 故第一部分为: A[0] = a A[1-2] = b.c
(1)翻转a:由于一个数就不翻转 (先翻转前部分)
(2)翻转bc: abc ---> acb (再翻转后半部分)
(3)翻转acb:acb ---> bca (从后到前都翻转)
三、算法
//逆序 public void Reverse(String A[],int from,int to) { for(;from < to;from++,to--) { String temp = A[from]; A[from] = A[to]; A[to] = temp; } } //循环右移 public void RightShift(String A[],int n,int k) { Reverse(A,0,n-k-1); Reverse(A,n-k,n-1); Reverse(A,0,n-1); }
package com.albertshao.csi.interview; /** * @author albertshao * */ public class Main20 { public static void main(String[] args) { Main20 m = new Main20(); String [] data = {"a","b","c","d","e"}; m.RightShift(data,data.length, 2); } //逆序 public void Reverse(String A[],int from,int to) { for(;from < to;from++,to--) { String temp = A[from]; A[from] = A[to]; A[to] = temp; } } //循环右移 public void RightShift(String A[],int n,int k) { Reverse(A,0,n-k-1); print(A); Reverse(A,n-k,n-1); print(A); Reverse(A,0,n-1); print(A); } public void print(String A[]) { for (int i = 0; i < A.length; i++) { System.out.print(A[i] + " "); } System.out.println(); } }
测试结果
c b a d e c b a e d d e a b c