「Leetcode系列」连女朋友看了都喜欢的五道题之:001, 007,009, 014, 020

「Leetcode系列」连女朋友看了都喜欢的五道题之:001, 007,009, 014, 020

image.png

前言:很多人说,做算法题没用,实际又用不到。我做算法题前没有女朋友,做了之后女朋友已经在我旁边打呼噜了,现在知道该干啥了吧。嘿嘿。加油吧!!!你看看我长这样都能找到女朋友,你们还等啥呢!

001.两数之和

题目

image.png

思路

image.png

思路:先设一个map用来存储,然后开始遍历数组nums,把元素当做key,索引index当做value,存进map里。当遍历到map里存在(target - 元素)这个key的这种情况时,把这个key所对应的value以及当前元素对应的索引值一起return

代码

var twoSum = function(nums, target) {
    // 设置一个map用来存储
    const map = new Map()
    for(let i = 0; i < nums.length ; i++) {
        // 计算target与当前元素的差值
        const chazhi = target - nums[i]
        if (map.has(chazhi)) {
            // 如果map里存在差值为key的情况,直接返回
            return [map.get(chazhi), i]
        } else {
            // 如果不存在则继续存储进map里
            map.set(nums[i], i)
        }
    }
};
复制代码



007.整数反转

题目

image.png

思路

思路:先把正负抽离出来,把该数字取绝对值,然后去进行不断地对10取余并拼在前方,最后再把正负归入返回值的判断中(注意区间)

代码

var reverse = function(x) {
    // 判断该数字正数或者是负数
    const flag = x < 0 ? -1 : 1
    // old:对该数字取绝对值,方便后面以正数来计算
    let old = Math.abs(x)
    // new:用来存储新数字
    let now = 0
    while (old > 0) {
        // old每次都对10取余,并且now乘10与之相加
        now = now * 10 + old % 10
        // 然后old除以10并取floor,准备下一次运算
        old = Math.floor(old / 10)
    }
    // 正负运算
    now = flag * now
    // 判断是否超出区间
    return now < Math.pow(-2, 31) || now > Math.pow(2, 31) - 1 ? 0 : now
};
复制代码



009.回文数

题目

image.png

思路

image.png

思路:双指针法,设置start与end指针,向中间靠拢,对应的元素不等就返回false,全都相等就返回true

代码

var isPalindrome = function(x) {
    // 先把数字转为字符串,便于遍历
    let numStr = x.toString()
    // 首位指针设置
    let start = 0, end = numStr.length - 1
    while(start < end) {
        // 一检测到首位不相同就返回false
        if (numStr[start] !== numStr[end]) return false
        // 否则双指针向中间靠拢
        start++
        end--
    }
    // 都相同那就返回true喽
    return true
};
复制代码



014.最大公共前缀

题目

image.png

思路

image.png

思路:

代码

var longestCommonPrefix = function (strs) {
    // 如果strs长度为0则直接返回空字符串
    if (!strs.length) return ''
    // longPrefix:用来存储最长前缀
    let longPrefix = ''
    let i = 0
    // 以第一个单词为基准进行遍历
    while (strs[0][i]) {
        // 单词的每一个字母
        let first = strs[0][i]
        if (strs.some(item => item[i] !== first)) {
            // 遍历strs,只要有一个单词的第i个字母跟第一个单词的第i哥字母不一样就返回当前longPrefix
            return longPrefix
        } else {
            // 否则,longPrefix继续拼接
            longPrefix += first
        }
        i++
    }
    return longPrefix
};
复制代码



020.有效的括号

题目

image.png

思路

image.png

思路:map存储左括号为key,右括号为value,遍历字符串,左括号情况则把左括号对应的value压进数组,右括号情况则判断弹出数组的前元素是否跟自身一样,不一样的话直接返回false

代码

var isValid = function(s) {
    // 如果s长度是奇数,不可能闭合,直接返回false
    if (s.length % 2 !== 0) return false
    // 设置一个map存储,左括号为key,右括号为value
    map.set('(', ')')
    map.set('[', ']')
    map.set('{', '}')
    const map = new Map()
    // 设置一个数组,用来遍历压栈
    const res = []
    for (let i = 0; i <= s.length; i++) {
        let item = s[i]
        if (map.has(s[i])) {
            // 左括号情况,直接push进数组
            res.push(item)
        } else {
            // 右括号情况,且右括号与前面的元素不相同直接返回false
            if (map.get(res.pop()) !== item) {
                return false
            }
        }
    }
    return true
};
复制代码

哎,各位可要注意身体哦,不要学的太着迷哦,留着身体以后可以好好找女朋友,陪女朋友哦!

分类:
前端
标签: