JavaScript数据结构与算法-String-(leetcode原题)

2019-05-20 admin

反转整数

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

思路:数字变字符串再变数组,这个主要就是运用的数组的常用api了,popshiftunshiftjoin

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let arr = (x + '').split('').reverse()
        let len = arr.length
        // 最大最小边界
        let min = -(2**31)
        let max = (2**31) - 1
        if (arr[len - 1] == '-') {
            arr.pop()
            if (arr[0] == 0) {   
                arr.shift()
                arr.unshift('-')
                let res = Number(arr.join(''))
                return res>=min&&res<=max?res:0
            } else {
                arr.unshift('-')
                let res = Number(arr.join(''))
                return res>=min&&res<=max?res:0
            }

        } else if (arr[0] == '0' && arr[len - 1] != '-') {
            arr.shift()
            let res = Number(arr.join(''))
            return res>min&&res<max?res:0
        } else {
            return Number(arr.join(''))>min&&Number(arr.join(''))<max?Number(arr.join('')):0
        }
};

字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

s = "leetcode"
返回 0.

s = "loveleetcode",
返回 2.

注意事项:您可以假定该字符串只包含小写字母。

思路:for of循环,找出字符出现的第一个位置和最后一个位置,如果两个值相等,则返回

/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    for (let v of s) {
        if (s.indexOf(v) === s.lastIndexOf(v)) return s.indexOf(v)
    }
    return -1
};

反转字符串中的单词

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 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
}

有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

思路:如果两个字符串包含的字母相同,那么排序的顺序也应该一样,基于此做循环判断。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function(s, t) {
    let s1 = s.split('').sort()
    let t1 = t.split('').sort()
    if (s1.length != t1.length) {
        return false
    }
    for(let i = 0;i<s1.length;i++) {
        if (s1[i]!=t1[i]) {
            return false
        }
    }
    return true
};

最后

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

[转载]原文链接:https://segmentfault.com/a/1190000019231510

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-65370.html

文章标题:JavaScript数据结构与算法-String-(leetcode原题)

相关文章
JavaScript实现PC手机端和嵌入式滑动拼图验证码三种效果
PC和手机端网站滑动拼图验证码效果源码,同时包涵了弹出式Demo,使用ajax形式提交二次验证码所需的验证结果值,嵌入式Demo,使用表单形式提交二次验证所需的验证结果值,移动端手动实现弹出式Demo三种效果 首先要确认前端使用页面,比如...
2017-03-17
详解HTML5游戏玩家流失原因
对任何类型的电子游戏来说,玩家流失都是一个无法回避的问题。玩家为什么离开游戏?近日,HTML5游戏设定师纳森·洛维托(Nathan Lovato)在游戏开发者网站Gamasutra撰写文章,解读了玩家离开游戏的16个理由。 HTML5游戏 ...
2015-11-12
JavaScript常用特效chm下载
下载地址:JavaScript常用特效chm下载 对了,如果打开空白,在手册上右键属性解除锁定即可。 ...
2015-11-12
JavaScript教程:JS中的原型
Keith Peters 几年前发表的一篇博文,关于学习没有“new”的世界,其中解释了使用原型继承代替构造函数。两者都是纯粹的原型编码。 标准方法(The Standard Way) 一直以来,我们学习的在 JavaScript 里创建对...
2015-11-12
WebSocket断开原因分析,再也不怕为什么又断开了
阅读原文:https://wdd.js.org/websocket-… 1. 把错误打印出来 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来。 在线demo地址:https://wdd.js.org/we...
2018-04-25
javascript是什么意思
avaScript是Netscape开发的一个对象脚本语言,它使用在世界各地数以百万计的网页和服务器应用程序上。 网景的JavaScript是ecma - 262版的标准脚本语言,和公布的标准只有轻微的差异。 与广为流行的错误理解相反,Ja...
2015-11-12
21天学通javascript
简介: 本书是Javascript入门教程。Javascript是Web开发中应用最早、发展最成熟、用户最多的脚本语言。其语法简洁,代码可读性在众多脚本语言中最好,它在使用时不用考虑数据类型,是真正意义上的动态语言。本书总分为四篇,共21章...
2015-11-16
canvas图片绘制跨域问题解决方案Tainted canvases may not be exported
图片跨域问题的一般解决方法 当使用canvas绘制网络图片的时候,经常会出现“Tainted canvases may not be exported”报错,上网搜一下解决方案,应该给的都是给img添加crossOrigin属性,尝试了一下...
2018-04-19
Node.js学习(1)----HTTP服务器与客户端
Node.js 标准库提供了 http 模块,其中封装了一个高效的 HTTP 服务器和一个简易的HTTP 客户端。http.Server 是一个基于事件的 HTTP 服务器,它的核心由 Node.js 下层 C++部分实现,而接口由 Jav...
2015-11-12
JavaScript的组成
一个完整的JavaScript由3个部分组成:核心(ECMAScript) 文档对象模型(DOM) 浏览器对象模型(BOM) ECMAScript 描述了该语言的语法和基本对象 ; DOM 描述了处理网页内容的方法和接口 ; BOM 描...
2015-11-12
回到顶部