逆序字符串(二)

题意

给定字符类型的数组chas和一个整数size,把整体为size的左半区移到右半区去
举个例子
ABCDE size=3,这样的话结果为DEABC


图片.png

实现的代码如下:

    public static void f(String str,int size)
    {
        char[] chas=str.toCharArray();
        rotote(chas,0, size-1);
        rotote(chas,size,chas.length-1);
        rotote(chas,0,chas.length-1);
        System.out.println(String.valueOf(chas));
    }

其中的rotote是逆序字符串(一)中的函数,实现起来非常简单

解法2

叙述起来较为复杂,我们通过图来描述


图片.png

首先我们来看看如何实现整体的交换的
我们先来想想要传入哪些参数
start end来限定整个子数组,size来表示整个需要交换的子数组的长度
像 1 2 3 4 5 6 7 A B C D 需要交换的就是ABCD和1234所以size是4
有了这些,我现在就开始来实现代码

public static void f(char[] chas,int start,int end,int size)
{
       int i=end-size+1;//取得A对应的位置
       while(size--!=0)//执行size次
       {
            //交换i和start位置的元素
            i++;start++;
       }
}

然后就是我们的核心函数

public static void f(String str,int size)
    {
        if(str==null||str.length()==0)
        {
            return;
        }
        char[] chas=str.toCharArray();
        int start=0;
        int end=chas.length-1;
        int lpart=size;
        int rpart=chas.length-size;
        int s=Math.min(lpart,rpart);
        int d=lpart-rpart;
        while(true)
        {
            exchange(chas,start,end, s);
            if(d>0)
            {
                start+=s;
                lpart=d;
            }else if(d<0)
            {
                end-=s;
                rpart=-d;
            }else
            {
                break;
            }
            s=Math.min(lpart,rpart);
            d=lpart-rpart;
        }
        System.out.println(String.valueOf(chas));
    }

你可能感兴趣的:(逆序字符串(二))