一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
进制转换
只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
异或法
这题说的是只有一个数出现了一次,其他数字都出现了2次,让我们求这个只出现一次的数字。这题使用位运算是最容易解决的,关于位运算有下面几个规律
- 1^1=0;
- 1^0=1;
- 0^1=1;
- 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 仅由括号 '()[]{}' 组成
栈
遍历字符串,如果是'(', '{', '['则入栈,如果是相反的,则进行判断
- 如果栈为空,返回false
- 如果栈有,且栈最新的那个跟当前这个不匹配,证明不是有效的括号(示例4),返回 false
代码只需要实现以上的步骤即可
/**
* @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
};