算法笔记_022:字符串的旋转(Java)

目录

1 问题描述

2 解决方案

2.1 蛮力移位

2.2 三步反转

 


1 问题描述

给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。例如,将字符串abcdef”的前3个字符‘a’、‘b’和‘c’移到字符串的尾部,那么原字符串将变成“defabc”。请写一个函数实现此功能。

 


2 解决方案

2.1 蛮力移位

此方法将需要移动的字符一个一个地移到字符串的尾部,具体代码如下:

package com.liuzhen.string_1;

public class StringRevolve {
    //方法1:蛮力移位
    /*
     * 参数s:给定字符串
     * 返回每次移动一位后的结果字符串
     */
    public String bruteOne(String s){
        char[] A = s.toCharArray();
        char temp = A[0];
        for(int i = 1;i < A.length;i++)
            A[i-1] = A[i];
        A[A.length-1] = temp;
        return String.valueOf(A);
    }
    /*
     * 参数s:给定字符串
     * 参数m:字符串前面需要移动的字符个数
     * 返回最终移动目标字符串
     */
    public String bruteRevolve(String s,int m){
        for(int i = m;i > 0;i--){
            bruteOne(s);
            System.out.println(bruteOne(s));
            s = bruteOne(s);
        }
        return s;
    }
    
    
    public static void main(String[] args){
        StringRevolve test = new StringRevolve();
        String s = "abcdef";
        String result = test.bruteRevolve(s,8);
        System.out.println("使用蛮力移位法得到结果:"+result);
    }
}

运行结果如下:

bcdefa
cdefab
defabc
efabcd
使用蛮力移位法得到结果:efabcd

 

2.2 三步反转

此方法分3个步骤:

(1)将原字符串分为XY两部分,其中X为“abc”,Y为“def;

(2)X的所有字符反转,即相当于将“abc”变为“cba”;对Y也进行反转,由“def”变为“fed;

(3)最后,将上述步骤得到的结果整体再进行反转,即将cbafed”整体反转为“defabc”,这样就实现了字符串旋转。

具体代码如下:

package com.liuzhen.string_1;

public class StringRevolve {
    
    //方法2:三步反转
    /*
     * 参数A:字符串转化后的字符数组
     * 参数start:开始进行反转的字符位置
     * 参数end:进行字符反转的最后一个字符位置
     */
    public void revolveString(char[] A,int start,int end){
        while(start < end){
            char temp = A[start];
            A[start++] = A[end];
            A[end--] = temp;
        }
    }
    /*
     * 参数s:给定字符串
     * 参数m:字符串前面需要移动的字符个数
     */
    public String getRevolveString(String s,int m){
        char[] A = s.toCharArray();
        int len = s.length();          //字符串的总长度
        m = m % len;                   //如果移动位数大于字符串总长度,则其移动位数默认为m取余len
        revolveString(A,0,m-1);
        revolveString(A,m,len-1);
        revolveString(A,0,len-1);
        return String.valueOf(A);
    }
    
    public static void main(String[] args){
        StringRevolve test = new StringRevolve();
        String s = "abcdef";
        String result1 = test.getRevolveString(s, 4);
        System.out.println("使用三步反转法得到结果:"+result1);
    }
}

 运行结果:

使用三步反转法得到结果:efabcd

 

posted @ 2017-02-09 20:19  舞动的心  阅读(736)  评论(0编辑  收藏  举报