来一起刷简单算法题[七] 栈

127 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

进制转换

只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

异或法

这题说的是只有一个数出现了一次,其他数字都出现了2次,让我们求这个只出现一次的数字。这题使用位运算是最容易解决的,关于位运算有下面几个规律

  1. 1^1=0;
  2. 1^0=1;
  3. 0^1=1;
  4. 0^0=0;

也就说0和1异或的时候相同的异或结果为0,不同的异或结果为1,根据上面的规律我们得到

a^a=0;自己和自己异或等于0

a^0=a;任何数字和0异或还等于他自己

a^b^c=a^c^b;异或运算具有交换律

有了这3个规律,这题就很容易解了,我们只需要把所有的数字都异或一遍,最终的结果就是我们要求的那个数字。来看下代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let result = 0
    for (let i = 0; i < nums.length; i++) {
        result ^= nums[i]
    }
    return result
};

集合法

遍历数字,把每一项添加到集合中,如何已经存在了,则删除,最终只会剩下一个元素

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    const set = new Set()
    nums.forEach(it => {
        if (set.has(it)) {
            set.delete(it)
            return
        }
        set.add(it)
    })
    return [...set][0]
};

有效的括号

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true

提示:

1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成

遍历字符串,如果是'(', '{', '['则入栈,如果是相反的,则进行判断

  1. 如果栈为空,返回false
  2. 如果栈有,且栈最新的那个跟当前这个不匹配,证明不是有效的括号(示例4),返回 false

iShot2022-04-06 15.08.46.gif

代码只需要实现以上的步骤即可

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    // 是基数或者空字符串,直接false
    if (s.length === 0 || s.length % 2 === 1) return false

    const stack = [] // 创建一个栈
    const map = { // 创建一个map,方便查找判断
      ')': '(',
      ']': '[',
      '}': '{'
    }

    for (let i = 0; i < s.length; i++) {
      const item = s[i] // 当前的字符
      if (!map[item]) { // 如果是'(', '{', '['则入栈
        stack.push(item)
      } else {
        if (!stack.length || stack.pop() !== map[item]) {
          return false
        }
      }
    }

    return stack.length === 0
};