20. 有效的括号:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路:
- 要满足题目的所有要求的话,那首先
s的长度肯定是个偶数,而且遍历他最后出现的一个 左括号 和最新出现的 右括号 肯定是要相互匹配的,否则肯定是错的 - 顺着这个思路,我们可以将循环中遇到的 左括号 都以从上往下存入一个栈中,即最新的值在栈的顶部,遇到 右括号 时,不断从栈中消除,当对应不上时,则表明字符串是无效的
/**
* @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)的 原地 算法解决这个问题吗?
思路:
- 轮转,就是把后面的拼到前面,原地 在原数组的基础上修改
- 一开始想的就是直接循环
k次,然后pop在unshift,但是提交提示超出时间限制 - 想办法缩减循环次数,
k可能是会超出数组长度的,所以直接以k % nums.length来循环,整除的值的循环次数对原数组的排序是没有影响的,但是提交提示还是超出时间限制 - 继续缩减需要操作的部分,直接从
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))
};