「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
有效的括号 Leetcode 20.
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 一开始我直接去中间值 有个start 和 end 循环对比 > 结果是 ()[]{} 是有问题的哈哈
- 那该怎么处理呢---- 栈 来了
- 栈 —— 先入后出, 用数组如果是括号左边把他存起来,如果是右括号则把数组最后一项取出来对比是否是一对括号
// 先传建一括号的map
const bkts = {
'(': ')',
'[': ']',
'{': '}'
}
function isValid(s) {
// 创建一个数组
const stack = []
for (let i = 0; i < s.length; i++) {
if (bkts[arr[i]]) {
bkts.push(arr[i])
} else {
if (arr[s] !== bkts[stack.pop()]) {
return false
}
}
}
// 当stack 为空 是 证明是左括号入栈和右括号出栈 正好可以匹配
return !stack.length
}
验证整数是否是有效的回文
- 开始 直接就写了下: 如果小于0则不是 个数 0 - 9 则是 大于9的时候 转成 string 逐个判断首尾
function isValidReverseInt(n) {
if (n < 0) return false
if (n < 10) return true
const s = `${n}`
for(let i = 0; i <= Math.floor(s.length / 2); i++) {
if(s[i] !== s[s.length - 1 - i]) {
return false
}
}
return true
}
- 官方给出的题解是通过对数的运算来处理的
- 现获取中位位置,截取前面的数
- 如果 前面的数等于后面的数(偶位数) 或者 等于去除后面的数的第一个位置(奇位数) 则是true
var isPalindrome = function(x: number): boolean {
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;
}
let revertedNumber: number = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x = Math.floor(x / 10);
}
return x === revertedNumber || x === Math.floor(revertedNumber / 10);
}
总结
- 栈 - 先入后出 处理一些 映射 匹配的问题
- 数值的计算的一些技巧 - 中位数的确认等