• 字符串的旋转


    题目描述

    对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括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);
     
        }
     
    };
    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    百度Hi之CSRF蠕虫攻击
    Portlet之讲解
    try-catch语句讲解
    unset之讲解
    MySQL bin-log 日志清理方式
    php数组array_push()和array_pop()以及array_shift()函数
    php中的func_num_args、func_get_arg与func_get_args函数
    PHP is_callable 方法
    如何实现php异步处理
    Mysql并发时经典常见的死锁原因及解决方法
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7236742.html
Copyright © 2020-2023  润新知