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

来源:互联网 发布:js代码格式化插件 编辑:程序博客网 时间:2024/05/22 17:15

一、问题描述

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



0 0
原创粉丝点击