剑指 Offer 58 - II. 左旋转字符串 | 刷题打卡

214 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

本题来自剑指 Offer 58 - II. 左旋转字符串

image.png

二、思路分析

从第n位开始截取字符串,分成两半,前一半放在后一半后面

三、AC代码

我这里有7种解法,依次是:

1.substr()截取+拼接

var reverseLeftWords = function(s, n) {
    return s.substr(n)+s.substr(0,n);
};

2.substring()和substr()一个意思

var reverseLeftWords = function(s, n) {
  return s.substring(n)+s.substring(0,n);
};

3.slice()还是内味儿

var reverseLeftWords = function(s, n) {
    return s.slice(n) + s.slice(0, n);
};

瞎*写写出来以上3种,那substr()、substring()、slice()的区别是啥?

  • 相同点:三者都接收两个参数。
  • 不同点1:

substr()接受的是其实位置和要截取的长度,
substring()和slice()接收的是起始位置和结束位置(不包括结束位置)。 比如

var test = 'hello world';

test.substr(4,7));            //o world
test.slice(4,7));             //o w
test.substring(4,7));         //o w

这里有个需要注意的地方就是:substring是以两个参数中较小一个作为起始位置,较大的参数作为结束位置。

比如

var test = 'hello world'

test.substring(7,4);  //o w

贼狠

  • 不同点2:

当接收的参数是负数时,
substr则仅仅是将第一个参数与字符串长度相加后的结果作为第一个参数;
substring则干脆将负参数都直接转换为0;
slice会将它字符串的长度与对应的负数相加,结果作为参数;

比如:

var test = 'hello world'; //长11位
  
test.substr(-3);        //rld 相当于test.substring(8);
test.substring(-3);     //hello world 相当于test.substring(0);
test.slice(-3);         //rld 相当于test.substring(8);
  
test.substr(3,-4);      //空字符串 因为他的第二个参数表示要截取的长度是-4,不合理
test.substring(3,-4);   //hel8 相当于test.substring(3, 0);
test.slice(3,-4);       //lo w 相当于test.substring(3, 7);

一脸懵逼,得缓一会儿


4.字符串拼接 也是内味儿

var reverseLeftWords = function(s, n) {
    return `${s.substr(n)}${s.substr(0, n)}`;
};

5.正则替换

var reverseLeftWords = function(s, n) {
    return s.replace(new RegExp('(\\w{' + n+ '})(\\w*)'),'$2$1')
};

6.concat()

var reverseLeftWords = function(s, n) {
    return s.slice(n).concat(s.slice(0, n));
};

7.replace()

var reverseLeftWords = function(s, n) {
     return s.replace(s.substr(0, n), '') + s.substr(0,n)
};

四、总结

又是心刺挠的一天