78

JavaScript数据结构与算法-String

 4 years ago
source link: http://finget.github.io/2019/05/14/arithmetic-string/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc" 
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

主要就是用到了数组的 splitreversejoinmap 方法,原理:就是把字符串变成数组,再利用数组自带的反转方法,最后再变成字符串返回。

export default (str) => {
  // 1.先将字符串转为数组
  let arr = str.split(' ')
  // 2.遍历数组,反转数组中的每一项
  let result = arr.map(item => {
    return item.split('').reverse().join('')
  })
  // 3.把新生成的数组转成字符串,用空格分开,返回结果
  return result.join(' ')
}

// 合并写法
export default (str) => {
    return s.split(/\s/g).map(item => {
        return item.split('').reverse().join('')
    }).join(' ')
}

计数二进制子串

给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。

示例 1 :
输入: "00110011"
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
请注意,一些重复出现的子串要计算它们出现的次数。
另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。

示例 2 :
输入: "10101"
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。

注意:
- s.length 在1到50,000之间。
- s 只包含“0”或“1”字符。

思路:使用一个 for 循环,将字符串从第一个开始传入 match 函数中,在 match 函数中利用正则表达式获取到字符串开头的字符(或是多个0或是多个1),再使用 repeat 方法,将开头获取到的多个0或1利用异或运算反转重复相同次数(举个例子:获取到了 ‘00’ ,那么反转之后就是 ‘11’ ),然后再建立一个正则表达式,将获取到的字符和反转后的字符拼接,使用test方法与传入的字符串进行比对,返回第一个比对成功的字符串,保存到数组 r 中。以此类推,剃掉原字符串的第一个字符后再调用一次 match 方法,直到原字符串只剩下1个字符,返回数组 r 的长度,即为题解。

export default (str) => {
  // 建立数据结构,堆栈,保存数据
  let r = []
  // 给定任意子输入都返回第一个符合条件的子串
  let match = (str) => {
    // 使用正则表达式获取字符串开头的字符
    let j = str.match(/^(0+|1+)/)[0]
    // 利用“异或”运算将字符反转并复制相同个数
    let o = (j[0] ^ 1).toString().repeat(j.length)
    // 合并上面两个字符串,创建正则表达式
    let reg = new RegExp(`^(${j}${o})`)
    // 与传入的字符串进行比对,返回第一个比对成功的子串
    if (reg.test(str)) {
      return RegExp.$1
    } else {
      return ''
    }
  }
  // 通过for循环控制程序运行的流程
  for (let i = 0, len = str.length - 1; i < len; i++) {
    let sub = match(str.slice(i))
    if (sub) {
      r.push(sub)
    }
  }
  return r.length
}

最后

创建了一个前端学习交流群,感兴趣的朋友,一起来嗨呀!

Ebi2u2i.png!web

Recommend

  • 52
    • Github github.com 5 years ago
    • Cache

    JavaScript 算法与数据结构

    JavaScript 算法与数据结构

  • 46
    • www.tuicool.com 4 years ago
    • Cache

    JavaScript数据结构与算法-Sort

    时间复杂度(运行次数) 我们假设计算机运行一行基础代码需要执行一次运算。 int aFunc(v...

  • 25
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    数据结构与算法javascript描述-散列表(下)

    线性探测法 上篇 [1] 讲了通过分离链接法来解决散列表冲突问题。今天我们学习一个新的方法来解决该问题。 核心思想是,如果出现了散列冲突,我们就重新探测一个空闲位置,将其插入。那如何重新探测新的位置呢?

  • 9

    数据结构与算法的JavaScript实现及应用 – 二叉查找树 在这篇文章里,我将介绍二叉查找树的基本操作和应用。 我们将看到二叉查找树操作的JavaScript的递归实现。由于递归受堆栈深度的限制,我们还将考虑非递归的实现。

  • 6

    在这篇文章里,我将介绍栈的基本操作和它的一些应用。 我们将看到栈在括号匹配检测,表达式求值,函数调用上的应用。 递归是一种特殊的函数调用,由于递归在程序设计中十分重要且不容易理解,所以我将阐述我对递归的理解。 最后我们将...

  • 13

    数据结构与算法的JavaScript实现及应用 – 单链表 为什么要写这个系列? 程序=数据结构+算法。 我对这句话的理解是构建程序等于解决问题。解决问题需要工具和方法,数据结构是工具,算法则是方法。 最近辞职了赋闲在...

  • 5

    JavaScript 数据结构与算法系统练习——攻克链表篇三元同学公众号「前端三元同学」,分享编程&个人成长干货

  • 6

    学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 几乎所有的语言都原生支持数组类型,因为数组是最简单的内存数据结构。该章节深入学习数组数据结构和它的能力。 1.1 数组添加元素...

  • 5

    学习数据结构的 git 代码地址: https://gitee.com/zhangning187/js-data-structure-study 1、队列和双端队列   队列和栈非常类似,但是使用了与 后进先出 不同的原则。双端队列是一种将栈的原则和队列的原则混合...

  • 2

    lua字符串通过操作算法和内存管理,有以下优点: 节省内存。 字符串比较效率高。(比较哈希值) 相同的字符串共享同一份内存么? 相同的长字符串一定不共享同一份内存么? lua字符串如何管理内存?

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK