【剑指offer-解题系列(44)】左旋转字符串

xiaoxiao2021-02-28  47

题目描述

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

分析

对于原本需要左移动的字符串 "abcXYZdef ",如果左移动3位,就变成 :  "XYZdef" + "abc", 则

设:n=3,N=9(字符串总长度)

可以遍历一遍数组,使用两个ind1=0,ind2,一个ind1指向开头,一个ind2指向移动后的第一个开头字符。

ind1保持不变,ind2每次减去 n(n=3),如果n<0,n = n+N。

原本ind2位置的数字被置换到0位置,则ind2的目标位置是在ind2-n。

在n不被N整除情况下,可以最终遍历完数组,但是n会被N整除的情况下则无法完成遍历

但是为了防止n会被N整除,可以把n减去1

 

代码实现

string LeftRotateString(string str, int n) {     int N = str.size();     if(N<=0||n<=0||N==n)return str;       int sign = 0;     if(N%n==0&&n!=1){         n-=1;         sign=1;     }     int position_now = 0;     int position_target = -n+N;     while(position_now!=position_target){         swap(str[position_now],str[position_target]);         //cout<<position_now<<" "<<position_target<<endl;         position_target = position_target-n;         while(position_target<0)             position_target+=N;     }     if(sign){         char tmp = str[0];         auto a = str.begin();         for(;a!=str.end()-1;a++){             *a=*(a+1);         }         *a=tmp;     }     return str; }

转载请注明原文地址: https://www.6miu.com/read-80502.html

最新回复(0)