LeetCode242有效的字母异位词
tag: #哈希表 #数组
leetcode 地址:242. 有效的字母异位词
代码:
// 通过数组的方式对每个字母进行统计数量,然后遍历数组,查看是否每一项都为0
function isAnagram(s: string, t: string): boolean {
if(s.length !== t.length) return false
const base: number = 'a'.charCodeAt(0)
const arr = new Array(26).fill(0)
for(let i = 0; i < s.length; i++) {
arr[s[i].charCodeAt(0) - base]++
arr[t[i].charCodeAt(0) - base]--
}
return arr.every(i => i === 0)
};
思路解析:
- 常规哈希表存储每个字母出现次数的思路不必赘言
- 这个思路巧妙的是通过数组的方式代替哈希表,通过数组下标,对应到不同的字母
LeetCode349两个数组的交集
tag: #哈希表 #Set
leetcode 地址:349. 两个数组的交集
代码:
function intersection(nums1: number[], nums2: number[]): number[] {
const map = {}, res = new Set<number>()
for(let i = 0; i < nums1.length; i++) {
map[nums1[i]] = 1
}
for(let i = 0; i < nums2.length; i++) {
let tem = nums2[i]
if(map[tem] === 1) {
res.add(tem)
}
}
return Array.from(res)
};
思路解析:
- 用 res = new Set
() 来存储,然后使用 Array.from 转换为数组
LeetCode202快乐数
tag: #哈希表
leetcode 地址:202. 快乐数
代码:
function isHappy(n: number): boolean {
const map = {}
while(n !== 1) {
if(map[n] === 1) return false
map[n] = 1
n = resetNum(n)
}
return true
};
function resetNum(num) {
let res = 0
while(num > 0) {
const tem = num % 10
res += tem * tem
num = Math.floor(num / 10)
}
return res
}
思路解析:
相似题目:
- 141. 环形链表利用 map 记录某个数是否已经出现过
LeetCode1两数之和
tag: #哈希表
leetcode 地址:1. 两数之和
代码:
function twoSum(nums: number[], target: number): number[] {
let map = {}
for(let i = 0; i < nums.length; i++) {
let minus = target - nums[i]
if(map[minus] !== undefined) {
return [map[minus], i]
}
map[nums[i]] = i
}
};
思路解析:
- 因为需要返回的是数组的下标,因此不能对数组进行排序
- 因此可以把对应的数值和数组下标存到一个哈希表里