JavaScript数据结构与算法-String

时间: 2019-05-14阅读: 44标签: 算法

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1:

 输入: "Let's take LeetCode contest"
 输出: "s'teL ekat edoCteeL tsetnoc" 

 注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

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

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(' ')
}


计数二进制子串

1给定一个字符串 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
}


原文来自  http://finget.github.io/2019/05/14/arithmetic-string/  


Js实现插入排序

插入排序是一种非常简单的算法,最适合大部分已经被排好序的数据。在开始之前,通过可视化演示算法如何运作一个好主意。你可以参考前面的动画来了解插入排序的工作原理。

最短编辑距离

1.第一行表示从ME到空字符所要删除的字符的所以情况 2.第一列表示从空字符到MY所需要插入字符的所有情况 3.斜箭头表示相同字符不需要替换,不相同字符所有替换次数的所有情况

轻松搞定时间复杂度

通过学习本文,你可以掌握以下三点内容:为什么需要时间复杂度;时间复杂度怎么表示;怎样分析一段代码的时间复杂度,相信认真阅读过本文,面对一些常见的算法复杂度分析,一定会游刃有余

js实现快速排序算法的2种方式

通过两个for循环,每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置,这个方法就是比较次数太多了,效率比较低。

js生成32位uuid算法总汇_js 如何生成uuid?

GUID是一种由算法生成的二进制长度为128位的数字标识符。GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中的 x 是 0-9 或 a-f 范围内的一个32位十六进制数。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。

Js加密算法_Base64

首先有个小Tips,1个字母字符 = 1个字节(byte) = 8位(bit),这是表示单位.Base64是网络上最常见的用于传输 8bit 的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。

动态规划解题思路

算法能力就是程序员的内力,内力强者对编程利剑的把控能力就更强。动态规划就是,通过递推的方式,由最基本的答案推导出更复杂答案的方法,直到找到最终问题的解。

Js哈希摘要算法

最近在看一些NPM库的时候总是看到各种哈希签名算法,之前工作中也有用到过签名算法,但并没有深入理解过其中的原理,于是找了点资料稍微了解了一下,总结了这篇文章。

JS算法之深度优先遍历(DFS)和广度优先遍历(BFS)

在开发页面的时候,我们有时候会遇到这种需求:在页面某个dom节点中遍历,找到目标dom节点,我们正常做法是利用选择器document.getElementById(),document.getElementsByName()或者document.getElementsByTagName(),

JavaScript实现获取两个排序数组的中位数算法示例

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 不同时为空。

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

广告赞助文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全