题目:有效的括号
Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.
An input string is valid if:
1 Open brackets must be closed by the same type of brackets.
2 Open brackets must be closed in the correct order.
- Example1
Input: "()"
Output: true
- Example2
Input: "()[]{}"
Output: true
- Example3
Input: "(]"
Output: false
- Example4
Input: "([)]"
Output: false
- Example5
Input: "{[]}"
Output: true
Open brackets must be closed by the same type of brackets.
Open brackets must be closed in the correct order.
- 解法思路
要想满足题意,那么其实括号的分布只会出现两种方式:
1 相应的括号一对一对挨着出现:
(){}[]
2 左边全是开括号,右边全是闭合括号:
( ( { [ ] } ) )
二者的规律:第一个闭合括号出现的时候,那么其左边的那个括号必然是其对应的开括号
- 解法
var isValid = function(s) {
let arr = [];
let obj = {
']': '[',
'}': '{',
')': '('
}
let strArr = s.split("");
for(let elem of strArr) {
// 将所有元素依次入栈
arr.push(elem);
//如果此时的元素为闭合括号
if(elem === ']' || elem === '}' || elem === ')') {
//将已经通过arr.push(item)放在数组末尾的右闭合括号删除
arr.pop();
//arr.pop()已经将数组末尾的闭括号删除掉
//由思路知,满足题意的话,此时数组的最后一个元素必然是与删除掉的闭括号对应的开括号,
// 如果是就删除掉了一对匹配的开闭括号,程序继续执行,不然就不符合题意return false
if(arr.pop() != obj[elem]) return false //这里再次执行了arr.pop()
}
//如果符合题意,数组arr中成对的括号都会删除掉,长度为0
return arr.length == 0 ? true : false;
}
- 以情况一:(){}[]为例
var arr = [ ]
arr = ['('] //arr.push()
arr = [ '(', ')' ] // arr.push
arr = ['('] // arr.pop()
arr = [] //arr.pop()
arr = ['{']
arr = [ '{', '}' ],
arr = ['{']
arr = []
复习Map
Es6的一种数据结构,可以用变量充当key,而传统的对象只能用字符串当作key
var map = new Map([ ['age',13],['name','zs']])
map.get('age‘) //13
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
for of 与for in区别
- for of
1、for of遍历的是具有 Iterator 接口的值,
2 不会遍历原型上的值
3 可以通过break推出循环
for(let key of arr){
console.log(key)
}
//12 4
- for in
1 可以遍历的有: 对象 数组 字符串 argument对象
2 遍历的都是其对应的key
3 其原型上的也会被遍历(hasOwnProperty解决)
4、for in 遍历的是对象可枚举的属性(key)
5 遍历顺序可能不按照实际数组顺序
(function() {
for (let key in arguments) {
console.log(key+':' + arguments[key]);
}
})('a', 'b');
//输出 0:a 1:b
var arr = [12,4]
arr.age = 55
for(let key in arr){
console.log(key)
}
// 12 4 age
- 具有Iterator接口的数据
Array
Map:
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let entry of iterable) {
console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]
Set
String 函数的argument对象
(function() {
for (let argument of arguments) {
console.log(argument);
}
})(1, 2, 3);
//1 2 3
NodeList对象
注意对象是没有Iterator接口的
var obj = {age:13} //不可以用for of遍历
```
网友评论