经典算法——左旋转字符串

 

个人分类: LeetCode C++ DataStructure&Algorithms

所属专栏: LeetCode算法分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/geekmanong/article/details/50913518

一、题目描述

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

二、解题思路
经典的三次翻转:
1.先翻转字符串前n个字符;
2.再翻转后面的字符;
3.翻转整个字符串;

比如:输入字符串s="12345abc",n=5;首先翻转前5个字符变成54321abc,然后翻转后面的字符变成54321cba,最后翻转整个字符串变成abc12345

 

 

 
  1. class Solution {

  2. public:

  3. string LeftRotateString(string str, int n) {

  4. if (str.empty() || n>str.length()) return str;

  5.  
  6. char *pData = const_cast<char*>(str.data());

  7. if (str.length() > 0 && n > 0 && n < str.length())

  8. {

  9. char* pBegin = pData + 0;

  10. char* pEnd = pData + n - 1;

  11. char* pBegin2 = pData + n;

  12. char* pEnd2 = pData + str.length() - 1;

  13.  
  14. reverse(pBegin, pEnd);//翻转字符串前面n个字符

  15. reverse(pBegin2, pEnd2);//翻转字符串的后面部分

  16. reverse(pBegin, pEnd2);//翻转整个字符串

  17. }

  18. return str;

  19. }

  20.  
  21. void reverse(char* pBegin, char* pEnd)

  22. {

  23. if (pBegin == NULL || pEnd == NULL) return;

  24. while (pBegin<pEnd)

  25. {

  26. char temp = *pBegin;

  27. *pBegin = *pEnd;

  28. *pEnd = temp;

  29. pBegin++;

  30. pEnd--;

  31. }

  32. }

  33. };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值