字符串左旋和右旋的常见方法

1.问题

比如数组,假设以数组的某个索引,或者索引之间,作为旋转中心,对数组进行逆时针(左旋)或顺时针(右旋)的旋转。
类似这样:

int[] a={1,2,3,4,5}

左旋3个之后 {4,5,1,2,3}

右旋3个之后 {3,4,5,1,2}

2.思路

2.1 O(1)空间
以字符串abcdef为例,若是左旋问题,首先我们可以拿出首个字符a,将其与后面的每一个字符交换一次,得到新的字符串bcdefa,然后进行交换得到cdefab,循环执行,一直到次数等于你给定的次数。(右旋与此类似)

缺点:
假设移动的位为k,则要循环k次,每次循环移动1位,这样的空间复杂度是0(1),时间复杂度是0(n*k)。

2.2 局部旋转
具体实现是先反转前k个字符,然后再反转后n - k个字符,最后再反转整个字符串。这种方法比上面一种方法高效。时间复杂度是0(n),空间复杂度为0(1)。
以字符串abcdef为例,希望得到cdefab.
我们先对 ab进行旋转,旋转的方法是,从两边元素开始,进行交换,直到前后指针相遇,旋转得到ba。
然后对 cdef进行旋转,旋转得到fedc.
最后,对 ba, fedc进行旋转,旋转方式一样,都是从两端 b, c进行位置交换,直到, f,e交换完成,得到, cdefab.


参考:

  1. 数组旋转

你可能感兴趣的:(LeetCode)