Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
    • 删除链表中的节点
    • 链表相交
    • 有效的括号
    • 盛最多水的容器
    • 整数反转
    • 删除链表中的重复元素
    • 合并两个有序链表
    • 删除有序数组中的重复项
    • 尾到头打印链表
    • 回文链表
    • 二进制链表转整数
    • 分隔链表
    • 复制带随机指针的链表
    • 设计循环队列
    • 最长公共前缀
    • 实现strStr
      • 转换成小写字母
      • 排序链表
    • Js链表
    • JavaScript排序
    • 随机数生成pi
    • algorithm
    junwen
    2021-04-01

    实现 strStr()

    leetcode 28 (opens new window)

    实现 strStr() 函数。

    给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

    示例 1:

    输入: haystack = "hello", needle = "ll"
    输出: 2
    
    1
    2

    示例 2:

    输入: haystack = "aaaaa", needle = "bba"
    输出: -1
    
    1
    2

    说明:

    • 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

    • 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

    解答:

    /**
     * @param {string} haystack
     * @param {string} needle
     * @return {number}
     */
    var strStr = function(haystack, needle) {
        let hLen = haystack.split("").length;
        let nLen = needle.split("").length;
        for(let i =0;i< hLen - nLen + 1; i++) {
            if(haystack.substring(i, i + nLen ) === needle) {
                return i;
            }
        }
        return -1;
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # 那么这里我们又引出了js的substr和substring的区别

    substr( start , length )

    start
    介于0(包含)和字符串长度之间的整数,表示从这个字符串开始截取子串;
    若 ≥ 字符串长度,则返回空字符串;
    若 < 0,则从右起计数;
    若 < 0且绝对值超过字符串长度的,视为0;
    length(可选)
    介于0(包含)和剩余字符串长度之间的整数,表示最大截取该长度的字符串作为子串;
    若超过剩余字符串长度,则截取到字符串结束,超出部分不计;
    若 ≤ 0,返回空字符串;
    若不指定长度,则返回该stringObject的 start 的位置到末尾;
    举个栗子:

    var str = 'hello,world';
        console.log('hello,world')
        console.log('(1, 2): ' + str.substr(1, 2));  //(1, 2): el
        console.log('(-3, 2): ' + str.substr(-3, 2));  // '(-3, 2): rl'
        console.log('(-3): ' + str.substr(-3));     // '(-3): rld'
        console.log('(1): ' + str.substr(1));      // '(1): ello,world'
        console.log('(-20, 2): ' + str.substr(-20, 2)); // '(-20, 2): he'
        console.log('(20, 2): ' + str.substr(20, 2));  // '(20, 2): '
    substring( start , end )
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    start
    介于0(包含)和字符串长度之间的整数,表示从该字符串开始截取子串;
    若 ≥ 字符串长度,则返回空字符串;
    end(可选)
    介于0(包含)和字符串长度之间的整数,表示从该字符开始不再被截取;
    若 > 字符串长度,则自动指定为字符串末尾;
    若不指定,则自动指定为字符串末尾;
    特殊情况
    任一参数 < 0,或为 NaN,则将其视为0;
    若 start == end,则返回空字符串;
    若 start > end,则两者交换数值;
    举个栗子:

        var str = 'hello,world';
    
        // Displays 'hello'
        console.log(str.substring(0, 5));
        console.log(str.substring(5, 0));
    
        // Displays 'hello,world'
        console.log(str.substring(0, 11));
        console.log(str.substring(-1, 11));
        console.log(str.substring(0, 15));
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    在Github上编辑此页 (opens new window)
    #leetcode#字符串
    上次更新: 4/1/2021, 4:03:44 PM
    最长公共前缀
    转换成小写字母

    ← 最长公共前缀 转换成小写字母→

    最近更新
    01
    如何打造全链路项目生命周期的统一交付平台
    04-10
    02
    如何建立前端标准化研发流程
    04-10
    03
    如何从0到1一步步成体系地搭建CI
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2019-2021 Syun
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式