一、问题描述
功能描述:数组的循环移位,
输入:{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