华为机试题---数组移位

一、问题描述

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



你可能感兴趣的:(java,机试)