面试题---编程----左旋字符串

左旋字符串

题目描述:

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。
  时间限制:1s;空间限制:32768K
思路:思路都在代码注释里面

此次编程用到的函数:

reverse函数具体用法的链接:http://www.cplusplus.com/reference/algorithm/reverse/

substr函数具体用法的链接:http://www.cplusplus.com/reference/string/string/substr/

swap函数具体用法的链接:http://www.cplusplus.com/reference/utility/swap/?kw=swap

class Solution {
public:
    string LeftRotateString(string str, int n) {
     //方法一:相加的方法,实现左移
          /*string l,r;
           for(int i=0;i<n;i++) r+=str[i];//eg:a+b+c
           for(int i=n;i<str.size();i++) l+=str[i];//X+Y+Z+d+e+f
           return l+r;*/
        
        //方法二:
    // reverse的用法:翻转的是起点和终点这段区间 和sort用法类似
       /* reverse(str.begin(), str.end());//fedZYXcba
        reverse(str.begin(), str.begin() + str.size() - n);//XYZdefcba
        reverse(str.begin() + str.size() - n, str.end());//XYZdefabc
        return str;*/
        
       // 方法三:substr函数的作用:返回一个从指定位置开始,并具有指定长度的字符串
/*int len = str.length();//求得字符串长度
        if(len == 0) return "";//判空
        n = n % len;//eg:3%9==3
        str += str;//str=abcXYZdefabcXYZdef
        return str.substr(n, len);*///XYZdefabc
        
//方法四:swap函数的用法:交换,等我学习了具体的使用,再来写博客,这个基本用法就是交换,
        //可以实现两个字符串的交换,也可以实现同一个字符串的交换,也可以实现两个变量的交换,
        //也可以通过传值,传址,传引用的,实现交换
        //(1)先将左边 3 个字符串进行翻转:abcXYZdef --> cbaXYZdef
   //2)再将右边剩余字符串进行翻转:cbaXYZdef --> cbafedZYX
  //(3)最后将整个字符串进行翻转: cbafedZYX --> XYZdefabc
 int len = str.size();
        if(len == 0)
        return str;
        n %= len;//eg:3%9==3
        for(int i = 0, j = n - 1; i < j; ++i, --j) 
       swap(str[i], str[j]);//从a到c交换,abcXYZdef --> cbaXYZdef
        for(int i = n, j = len - 1; i < j; ++i, --j)
        swap(str[i], str[j]);//从X到f交换,cbaXYZdef --> cbafedZYX
        for(int i = 0, j = len - 1; i < j; ++i, --j) 
        swap(str[i], str[j]);//从c到X交换, cbafedZYX --> XYZdefabc
        return str;
//方法五:最基本的,和方法四类似
          //(1)先将左边 3 个字符串进行翻转:abcXYZdef --> cbaXYZdef
   //2)再将右边剩余字符串进行翻转:cbaXYZdef --> cbafedZYX
  //(3)最后将整个字符串进行翻转: cbafedZYX --> XYZdefabc
 /*void fun(string &s,int start,int end)
    {
        char temp;
        while(start<end)
        {
            temp=s[start];
            s[start]=s[end];
            s[end]=temp;
            start++;
            end--;
        }
    }
    string LeftRotateString(string str, int n) {
        int len=str.length();//求得字符串长度
        if(0==len || 0==n)//判空
            return str;
        string &temp=str;
        fun(temp,0,n-1);//从a到c交换,abcXYZdef --> cbaXYZdef
        fun(temp,n,len-1);//从X到f交换,cbaXYZdef --> cbafedZYX
        fun(temp,0,len-1);//从c到X交换, cbafedZYX --> XYZdefabc
        return str;*/
    
    }
};

猜你喜欢

转载自blog.csdn.net/pigdwh/article/details/81950537
今日推荐