zoukankan      html  css  js  c++  java
  • Java实现字符串的旋转

    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)将原字符串分为X和Y两部分,其中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
    
  • 相关阅读:
    asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
    asp.net core系列 75 Elasticsearch与中文分词配置
    asp.net core系列 74 Exceptionless服务端安装
    nginx for windows
    asp.net core系列 73 Exceptionless+Nlog以及Apollo介绍
    asp.net core系列 72 Exceptionless使用介绍
    asp.net core系列 71 Web架构分层指南
    asp.net core系列 70 即时通迅-WebSocket+Redis发布订阅
    asp.net core系列 69 Amazon S3 资源文件上传示例
    asp.net core系列 68 Filter管道过滤器
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12948075.html
Copyright © 2011-2022 走看看