开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
前言
本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。
- 今天还是来看一下哈希的题目 383. 赎金信 , 205. 同构字符串, 169. 多数元素
Leetcode 383. 赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
解题
这道题和 242.有效的字母异位词 很像,字母异位是求两个字符是否可以互相组成,而这道题是 字符串 ransomNote 能不能由 magazine 构成,而不在乎 magazine 能不能由 ransomNote 构成。
通过一个map表去把 ransomNote 的元素个数都保存下来,再去遍历 magazine 抵消掉对应的元素,最后看看map表中的每一个元素是否都小于等于0.
function canConstruct(ransomNote: string, magazine: string): boolean {
let arr: number[] = new Array(26).fill(0);
let base: number = 'a'.charCodeAt(0);
let index: number;
for (let i = 0, length = ransomNote.length; i < length; i++) {
arr[ransomNote[i].charCodeAt(0) - base]++;
}
for (let i = 0, length = magazine.length; i < length; i++) {
index = magazine[i].charCodeAt(0) - base;
arr[index]--;
}
return arr.every(i => i <= 0)
}
Leetcode 205. 同构字符串
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
解题
还是跟上面一样的思路,通过map表来保存下一个字符的每一个位置对应的值,然后通过另一个字符串的首个字符的相差值来判断接下去的字符,按照题目的意思,每一个对应的位置上的偏差值都应该相等。
var isIsomorphic = function (s: String, t: String) {
let map = new Map()
for (let i = 0; i < s.length; i++) {
const a = s[i], b = t[i]
if (map.has(a) ? map.get(a) !== b : Array.from(map.values()).includes(b)) {
return false
}
map.set(a, b)
}
return true
};
Leetcode 169. 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解题
我们使用哈希表来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。
我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。并且在这个过程当中,通过打擂台的方式保存下出现次数最多的元素,以及具体的出现次数方便下次判断。
function majorityElement(nums: number[]): number {
let map = new Map();
let count = 0;
let res = 0;
for (let i = 0; i < nums.length; i++) {
map.set(nums[i], map.get(nums[i])+1 || 1)
if(map.get(nums[i]) >= count){
count = map.get(nums[i])
res = nums[i]
}
}
return res;
};