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)次,那么结论是,有效右旋次数等于右旋次数%字符串长度。

方案一:右旋概念:

左旋字符

左旋字符

左旋字符

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

例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0. 

由左旋方法说三可知,拼接后的字符串为左旋的所以结果,所以可以利用strstr函数:

左旋字符

左旋字符

左旋字符








相关文章:

猜你喜欢
  • 2021-05-30
  • 2021-05-20
相关资源
相似解决方案