• 26. 左旋转字符串


    题目:定义字符串的左旋转操作,把字符串前面的若干个字符移动到字符串的尾部

    解:

    1.最笨的一种方法就是,每次将字符串左移1个位置,然后把最左边的字符放到最后,这样移动满次数就行,假设字符串长度是n,要移动前面m个字符(m<=n)那么,时间=O(m*n)

    2.编程珠玑上的题目,把n长字符串分为m n-m,记m长子串为A,n-m长子串为B,则字符串可表示为AB,移动之后的字符串=BA,首先求A的转置A(t)(即字符串逆置),B的转置B(t)

    然后求A(t)B(t)的转置,(A(t) B(t))(t)=(B(t))(t) (A(t))(t)=BA

    代码

    #include<iostream>
    #include<string>
    #include<string.h>
    #include<stdio.h>
    
    using namespace std;
    
    /*
         第一种
         这个时间是O(kn),空间是O(1)
     */
    
    void leftreverse(string& str,int k)
    {
        int i=0;
        while(i<k)
        {
            char temp=str[0];
            int j;
            for(j=1;j<str.size();j++)
                str[j-1]=str[j];
            str[j-1]=temp;
    
            i++;
        }
    }
    
    
    /*
         第二种
         根据XY的转置求
     */
    
    //逆转字符串
    void reverse(char* begin,char* end)
    {
        if(begin!=NULL && end!=NULL)
        {
            while(begin<end)
            {
                char temp=*begin;
                *begin=*end;
                *end=temp;
    
                begin++;
                end--;
            }
        }
    }
    
    void leftreverse2(char* str,int k)
    {
        if(str)
        {
            int length=static_cast<int>(strlen(str));
            if(length>0 && k>0 && k<length)
            {
                    char* firststart=str;
                    char* firstend=str+k-1;
                    char* secondstart=str+k;
                    char* secondend=str+length-1;
    
                    reverse(firststart,firstend);
                    reverse(secondstart,secondend);
                    reverse(firststart,secondend);
            }
        }
    }
    
    #define MAX 100
    int main(void)
    {
        char str[MAX];
        int k;
        cin>>str;
        cin>>k;
    
        leftreverse2(str,k);
        cout<<str<<endl;
        return 0;
    }
  • 相关阅读:
    第一天 学习绪论
    我的java学习道路
    windows2003 iis+dedecms 4.0701版本,登录后台显示空白
    iis+php+mysql
    net 连mysql奇怪问题
    Windows 2008安装SQL 2008图解
    注册码
    [VS2013]如何闪开安装VS2013必须要有安装IE10的限制
    net SqlBulkCopy拷贝数据的问题
    Android应用与系统安全防御
  • 原文地址:https://www.cnblogs.com/buxianghe/p/3262355.html
Copyright © 2020-2023  润新知