您的位置:首页 > 其它

左旋字符

2018-02-28 20:31 190 查看
1.实现一个函数,可以左旋字符串中的k个字符。 
ABCD左旋一个字符得到BCDA 
ABCD左旋两个字符得到CDAB 
分析:左旋一个字符可以理解为左旋两次,左旋两个字符可以理解为左旋2次。那左旋一次就相当于将除了最左边一个字符,其余字符向左移动一个位置,然后把最左边字符放在最右边,如将ABCD左旋一次,将BCD向左移动一个位置,A放在最右边;左旋两次相当于除了左边两个字符,其余字符向左移动一个位置,然后把左边两个字符一次放在右边....
那么对于左旋ABCD,左旋一次BCDA,左旋两次CDAB,左旋三次DABC,左旋四次ABCD,左旋五次BCDA。由此发现左旋4次就恢复原始字符串,左旋5次就相当于左旋1(5%4)次,那么结论是,有效左旋次数等于左旋次数%字符串长度。
方案一:左旋概念:





结果为:



方案二:逆置
左旋ABCD两次
将ABCD分为两部分,一部分是AB,另一部分是CD
逆置AB                  BACD   即  (str----str+2-1)        推广为:(str---str+count-1)(count为有效左旋次数)
逆置CD                 BADC   即   (str+2----str+4-1)    推广为:(str+count-----str+len-1)(len为字符串长度)
整体逆置 BADC     CDAB   即      (str------str+4-1)     推广为:   (str-----str+len-1)
代码如下:



结果为:



方案三:拼接字符串
左旋ABCD 
拼接为:ABCDABCD,若左旋两次,将指针指向C(str+2),然后再从C向后连续输4(len),那么就为CDAB即为左旋两次结果。
这种方法称为穷举,也就是将左旋结果全部列出。



结果为:



三种方法建议选择第二种方法。
那么右旋呢?
那右旋一次就相当于将除了最右边一个字符,其余字符向右移动一个位置,然后把最右边字符放在最左边,如将ABCD左旋一次,将ABCD向右移动一个位置,D放在最右边;右旋两次相当于除了右边两个字符,其余字符向右移动一个位置,然后把右边两个字符依次放在左边....那么对于右旋ABCD,右旋一次DABC,左旋两次CDAB,左旋三次BCDA,左旋四次ABCD,左旋五次DABC。由此发现右旋4次就恢复原始字符串,右旋5次就相当于右旋1(5%4)次,那么结论是,有效右旋次数等于右旋次数%字符串长度。

4000
方案一:右旋概念:







2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. 
由左旋方法说三可知,拼接后的字符串为左旋的所以结果,所以可以利用strstr函数:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  左旋
相关文章推荐