题目
-
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
-
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab” -
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose” -
限制:
1 <= k < s.length <= 10000
思路
- 分别截取再拼接。
- 叠加两次字符串,再进行截取,如:abcd + abcd = abcdabcd,n为2,则截取2-5的字符。
- 根据 ((A翻转)(B翻转))翻转=BA,可以先将字符串的前半部分逆置,再将后半部分逆置,最后再整体逆置,就能实现字符串左旋。【剑指OFFER解法】
// 解法1
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function(s, n) {
if (n <= 0) return s
const realN = n % s.length
return `${s.slice(realN)}${s.slice(0, realN)}`
};
// 解法2
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords_2 = function(s, n) {
if (n <= 0) return s
const s2 = s + s
const realN = n % s.length
return s2.slice(n, s.length + n)
};
// 剑指OFFER解法
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords_3 = function(s, n) {
if (n <= 0) return s
const realN = n % s.length
const prev = s.slice(0, realN).split('')
const after = s.slice(realN).split('')
const reverse = (arr) => {
let i = 0
let j = arr.length - 1
while (i < j) {
[arr[i], arr[j]] = [arr[j], arr[i]]
i++
j--
}
return arr
}
const reversePrev = reverse(prev)
const reverseAfter = reverse(after)
return reverse([...reversePrev, ...reverseAfter]).join('')
};