[路飞_验证有效的括号和验证整数是否是有效的回文]

175 阅读1分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

有效的括号 Leetcode 20.

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

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

  1. 一开始我直接去中间值 有个start 和 end 循环对比 > 结果是 ()[]{} 是有问题的哈哈
  2. 那该怎么处理呢---- 来了
  3. 栈 —— 先入后出, 用数组如果是括号左边把他存起来,如果是右括号则把数组最后一项取出来对比是否是一对括号
// 先传建一括号的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
}

验证整数是否是有效的回文

  1. 开始 直接就写了下: 如果小于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
 }

  1. 官方给出的题解是通过对数的运算来处理的
  • 现获取中位位置,截取前面的数
  • 如果 前面的数等于后面的数(偶位数) 或者 等于去除后面的数的第一个位置(奇位数) 则是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);
}

总结

  1. - 先入后出 处理一些 映射 匹配的问题
  2. 数值的计算的一些技巧 - 中位数的确认等