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

一、题目描述

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

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

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




class Solution {
public:
	string LeftRotateString(string str, int n) {
		if (str.empty() || n>str.length())  return str;

        char *pData = const_cast<char*>(str.data());
        if (str.length() > 0 && n > 0 && n < str.length())
        {
            char* pBegin = pData + 0;
            char* pEnd = pData + n - 1;
            char* pBegin2 = pData + n;
            char* pEnd2 = pData + str.length() - 1;

            reverse(pBegin, pEnd);//翻转字符串前面n个字符
            reverse(pBegin2, pEnd2);//翻转字符串的后面部分
            reverse(pBegin, pEnd2);//翻转整个字符串
        }
		return str;
	}
    
    void reverse(char* pBegin, char* pEnd)
	{
		if (pBegin == NULL || pEnd == NULL)  return;
		while (pBegin<pEnd)
		{
			char temp = *pBegin;
			*pBegin = *pEnd;
			*pEnd = temp;
			pBegin++;
			pEnd--;
		}
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值