壹 ? 引
简单的题目简单做,本题来自leetcode面试题58 - II. 左旋转字符串,题目描述如下:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
我们简单分析题目,来说说有哪些方式可以实现它。
贰 ? 轻松题解
其实在JS leetcode 旋转数组 题解分析一文中我们已经做过了类似的题目,只是之前旋转的是数组,这次换成了字符串。当然,数组那题由于k没有限制,相对上来说还麻烦一点,比如我们得考虑k正好是数组length倍数的情况。
本题已经明确给出k范围为[1,s.length),所以不存在字符串旋转了一整圈的情况,那么我们直接开始解题。
说在前面,JavaScript中没有任何API能修改原字符串,我们能做的也就是复制字符串重新组合。
贰 ? 壹 使用substr
先直接上代码:
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function (s, n) {
return s.substr(n) + s.substr(0, n);
};
我们简单复习下substr(start,length)
,它表示从start(下标)开始复制length个字符,如果不写length,则一直复制到结束。
let str = ‘echo‘;
str.substr(0,1);//‘e‘
str.substr(0);//‘echo‘
str.substr(1,2);//‘ch‘
贰 ? 贰 使用substring
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function (s, n) {
return s.substring(n) + s.substring(0, n);
};
你看,这个substring
与substr
还挺像,那这个substring
啥意思呢?substring(start,stop)
表示从start(下标)开始复制到stop前一位的字符,注意,包含start元素但不包含stop。所以返回的字符长度为stop-start。
let str = ‘echo‘;
str.substring(0,1);//‘e‘
str.substring(0);//‘echo‘
str.substring(1,2);//‘c‘
贰 ? 叁 使用slice
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function (s, n) {
return s.slice(n) + s.slice(0, n);
};
slice与substring方法神似,同样接受两个参数,第一位表示复制的起点,第二位表示复制的终点,但不包含终点下标的元素。
那它两有什么区别呢,真要说就是slice能操作字符以外还能操作数组,效果还是一样
let arr = [1,2,3,4];
arr.slice(0,1);//[1]
arr.slice(0);//[1,2,3,4]
arr.slice(1,2);//[2]
贰 ? 叁 转数组
/**
* @param {string} s
* @param {number} n
* @return {string}
*/
var reverseLeftWords = function (s, n) {
let arr = s.split("");
return arr.concat(arr.splice(0, n)).join("");
};
这里就是将字符串转成了数组,利用splice方法裁剪出需要旋转的元素,拼接后数组后面再还原成字符串。
需要注意的是splice会修改原数组,这与slice还是有很大差别。
那么关于本题就说到这了。