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

    题目描述

    对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。

    给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。

    测试样例:
    "ABCDEFGH",8,4
    返回:"FGHABCDE"


    问题简化:假设现在只要把E放在左边,那么我们可以先用一个变量记录E,然后把整个字符串向右移动一位,第一个空出来的位置用变量填充,即达到效果。
    那么现在的问题,就是把p到n-1的字符放在串首,还是和上面一样道理,只是加一个外循环,看需要向右移动几次。代码如下:
    class StringRotation {
    public:
        string rotateString(string A, int n, int p) {
            // write code here
            char ch;
            for(int i=0;i<n-p-1;i++) {
                ch=A[n-1];
                for(int j=n-1;j>=1;j--) {
                    A[j]=A[j-1];
                }
                A[0]=ch;
            }
            return A;
        }
    };

    思路:题目的意思是把后部分的字符串都转移到原字符串的串首。那么首先需要计算有多少个字符需要转移。用一个外循环,n-1-p即为后部分的字符数(所需要转移字符);另外设一个字符ch用来记录最后一个字符,然后开始用一个内循环,每次删除最后一个字母,直到删除到0处,把ch记录的字符放在下标为0处;

    通过查阅资料,发现一些简单方法.

    第一次两部分分别reverse 。
    第二次整体reverse。
    string rotateString(string A, int n, int p) {
        // write code here
        //剑指offer上的题目,两次翻转
         
        //先进行局部翻转
        int i = 0, j = p;
        while(i < j)
            swap(A[i++], A[j--]);
         
        i = p + 1, j = n - 1; 
        while(i < j)
            swap(A[i++], A[j--]); 
         
        //再整体翻转
        i= 0, j = n - 1;
        while(i < j)
            swap(A[i++], A[j--]);
         
        return A;
         
    }
    
     // 如果调用reverse函数,看起来更简单。。。 
    
    string rotateString(string A, int n, int p) {
        // write code here
        //剑指offer上的题目,两次翻转
         
        //先进行局部翻转
        reverse(A.begin(), A.begin()+p+1); //vector的迭代器支持 + 
        reverse(A.begin()+p+1, A.end());
        //再整体翻转
        reverse(A.begin(), A.end());
         
        return A;
         
    }
    拼接两个字符串,从中间截取源字符串长度,就得到了旋转字符串
    classStringRotation {
     
    public:
     
        string rotateString(string A, intn, intp) {
     
            // write code here
     
            return(A+A).substr(p+1,n);
     
        }
     
    };
    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    20145220韩旭飞《网络对抗》第一周学习
    学号20145220假期复习
    最简单易懂的Idea搭建SSM项目过程和配置(文末有demo哦)
    Navicate快捷键
    String.format()方法
    tomcat点击startup.bat出现闪退
    Shiro使用总结
    layer弹出层icon图标记录
    传统javabean与spring中的bean的区别【转】
    在Spring + SpringMVC + mybatis架构的项目基础上集成Shiro
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7236742.html
Copyright © 2011-2022 走看看