字符串移位的解题技巧
来源:互联网 发布:php高级工程师面试题 编辑:程序博客网 时间:2024/04/30 19:21
题目链接:左旋转字符串
汇编语言中有一种移位指令叫做循环左移(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操作的第二个参数需要往后移动一位。
0 0
- 字符串移位的解题技巧
- 字符串移位包含的问题——解题笔记
- 字符串的移位
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位的算法实现
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 字符串移位包含的问题
- 数据库中间件Mycat源码解析(三):Mycat的SQL解析和路由
- 华为机试(扑克牌大小3.3)
- JAVA UncaughtExceptionHandler 处理
- vector123
- 使用mysql 存储过 对日志表按照天分区
- 字符串移位的解题技巧
- 2016半年总结
- 基于Boost的数据处理器及线程安全队列、跨平台的信号量和互斥锁
- ubuntu安装到SD卡
- 10. Yii 2.0 Session
- 反编译APK
- [Java并发包学习七]解密ThreadLocal
- python requests模块的安装和使用方法
- Jquery李炎恢——52Ajax提交表单【18】