leetCode 编号20和189

78 阅读2分钟

20. 有效的括号:给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。
思路:
  1. 要满足题目的所有要求的话,那首先s的长度肯定是个偶数,而且遍历他最后出现的一个 左括号 和最新出现的 右括号 肯定是要相互匹配的,否则肯定是错的
  2. 顺着这个思路,我们可以将循环中遇到的 左括号 都以从上往下存入一个栈中,即最新的值在栈的顶部,遇到 右括号 时,不断从栈中消除,当对应不上时,则表明字符串是无效的
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
    // 所有左括号组成一个数组
    let leftBracket = ['(', '{', '[']
    // 每一个右括号及其对应的左括号
    let rightBracketObj = {
        ')': '(',
        ']': '[',
        '}': '{'
    }
    // 存储的栈
    let leftStack = []
    let len = s.length
    // 是否为偶数
    let isEvenNumber = (len % 2 === 0)
    for(let i = 0; i < len; i++) {
        let item = s[i];
        // 是左括号则从顶部添加至栈中
        if (leftBracket.indexOf(item) > -1) {
            leftStack.unshift(item)
        } else {
            // 右括号和栈顶部的左括号相对应 则消除栈顶部左括号
            if (rightBracketObj[item] == leftStack[0]) {
                leftStack.shift()
            } else {
                return false
            }
        }
    }
    // 循环结束后栈中没值 且为偶数 说明都是一一对应的括号
    return leftStack.length === 0 && isEvenNumber
};

189. 轮转数组:给定一个整数数组 nums,将数组中的元素向右轮转 k **个位置,其中 k **是非负数。 进阶:

  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
思路:
  • 轮转,就是把后面的拼到前面,原地 在原数组的基础上修改
    1. 一开始想的就是直接循环k次,然后popunshift,但是提交提示超出时间限制
    2. 想办法缩减循环次数,k可能是会超出数组长度的,所以直接以k % nums.length来循环,整除的值的循环次数对原数组的排序是没有影响的,但是提交提示还是超出时间限制
    3. 继续缩减需要操作的部分,直接从nums尾部splice(len-n),然后reverse,在将得到的数组,unshift来拼接到nums上,提交成功
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
    let len = nums.length
    let n = k % len
    let newArr = nums.splice(len - n).reverse()
    newArr.forEach(item => nums.unshift(item))
};