字符串移位的解题技巧

原创 2016年08月28日 22:43:03

题目链接:左旋转字符串

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

分析:初看到这题,感觉十分简单,写两个循环即可,先把后面的字符串提取出来,再将前面的放在后面即可得到。代码如下:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        string s = "";
        for(int i = n;i<str.length();++i)
            s+=str[i];
        for(int i = 0;i<n;++i)
            s+=str[i];
        return s; 
    }
};

或者利用substr函数:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int lens=str.size();
        if (lens<n)  
			return str;
        return str.substr(n)+str.substr(0,n);
    }
};

但是除了这个比较直观的方法,这题还有其它思路比较巧妙的方法,讨论如下。

(1)可以借鉴翻转子串的解题技巧这篇博客里字符串处理得思路,将原字符串自己和自己连接在一起,再取其中一部分子串即可得到,代码如下:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.length();
        if(len == 0) return "";
        n = n % len;
        str += str;
        return str.substr(n, len);
    }
};
(2)可以采用reverse()函数操作。举例一个序列abcdefg向左循环移动3位,则会得到(defg)(abc),我们可以将原字符串分为两个部分,A=(abc),B=(defg),那么原字符串为AB,我们要的结果为BA,可以如下进行操作:(ArBr)r = ((B)r)r((A)r)r=BA。其中r代表进行reverse()函数操作。可以得到具体操作过程如下:

(i)cba defg 

(ii)cba gfed

(iii) defgabc
根据上述思路可以得到代码如下:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        reverse(str.begin(),str.begin()+n);
        reverse(str.begin()+n,str.end());
        reverse(str.begin(),str.end());
        return str; 
    }
};
注意:STL中的迭代器是左闭右开区间,因此reverse操作的第二个参数需要往后移动一位。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ

这道题目应该还比较简单,注意对旋转的数字的取模处理,然后就是利用两个string来分别存下旋转的前后部分,组后综合输出即可。

《剑指Offer》面试题:对字符串进行循环左移

题目 /* 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。 对于一个给定的字符序列S,请你把其循环左移K位后...

字符串循环左移

伟大在于把简单的事情做的完美 在牛客上看到这样一道题: 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序...

什么是AMF?AMF0和AMF3

最近由于工作需求,对amf做了一些了解,此前对flash相关的技术用的太少,以至于n年前提出来的amf协议都不曾过耳。。 – -#以下是关于amf的一篇文章。Flash Remoting的核心技术...

推荐几个很好的编程在线测试平台 online judge

现在又不少在线测试平台,这些平台提供了很多很好的编程题,当然著名的acm中会有很多难题,如果你想挑战自己的智力极限,如果你对编程很有兴趣,那么就可以去这些平台注册,然后编程提交,跟其他编程高手一较高下...

一些在线编程练习或调试网站

总结了一些在线编程练习的网站、学习网站以及在线代码调试网站,以供参考,欢迎补充!一、代码练习网站 欧拉计划问题 Leetcode OJ 赛码网在线编程 计蒜客 牛客网在线编程 PAT(Pr...

在线学习编程网站收集

下面收集一些个人觉得比较好的在线学习编程网站。当然用google搜索下,会有很多推荐。 update 2015-11-11 收集到几个做题网站 http://www.codewars.c...

十大在线编程学习网站

http://www.csdn.net/article/2013-12-03/2817687-best-websites-to-learn-mobile-dev-and-design/2
  • sgnyyy
  • sgnyyy
  • 2013-12-06 09:27
  • 21330

【算法】字符串左移函数的O(n)解法

例如,字符串 abcdef ,若要让def翻转到abc的前头,只要按照下述3个步骤操作即可: 首先将原字符串分为两个部分,即X:abc,Y:def; 将X反转,X->X^T,即得:abc->c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)