242、有效的字母异位词
0. 题面
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: (s = 'anagram'), (t = 'nagaram');
输出: true;
示例 2:
输入: (s = 'rat'), (t = 'car');
输出: false;
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
解法 1: 排序
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
return s.split('').sort().join('') === t.split('').sort().join('');
};
思路:
- 将字符串转为数组,排序后再转为字符串,比较两个字符串是否相等。
- 复杂度:时间复杂度 O(nlogn),空间复杂度 O(1)
解法 2: 哈希表
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (s.length !== t.length) {
return false;
}
const map = new Map();
for (let i = 0; i < s.length; i++) {
map.set(s[i], (map.get(s[i]) || 0) + 1);
map.set(t[i], (map.get(t[i]) || 0) - 1);
}
for (const value of map.values()) {
if (value !== 0) {
return false;
}
}
return true;
};
思路:
- 使用哈希表存储每个字符出现的次数,然后比较遍历这个哈希表,一个加一,一个减一,最后判断是否都为 0。
- 复杂度:时间复杂度 O(n),空间复杂度 O(1)
347、前 K 个高频元素
0. 题面
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: (nums = [1, 1, 1, 2, 2, 3]), (k = 2);
输出: [1, 2];
示例 2:
输入: (nums = [1]), (k = 1);
输出: [1];
提示:
1 <= nums.length <= 10^5
k 的取值范围是 [1, 数组中不相同的元素的个数]
题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一
解法
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function (nums, k) {
const obj = {};
for (let i = 0; i < nums.length; i++) {
if (obj[nums[i]]) {
obj[nums[i]] = obj[nums[i]] + 1;
} else {
obj[nums[i]] = 1;
}
}
const keys = Object.keys(obj);
const result = [0];
for (let i = 0; i < keys.length; i++) {
result[obj[keys[i]]] = keys[i];
}
return result.splice(k, result.length - 1);
};
思路:
- 遍历数组,将每个元素出现的次数存入对象。
- 遍历对象,将每个元素出现的次数作为索引,元素作为值存入数组。
- 返回数组中索引从 k 开始到末尾的元素。
- 复杂度:时间复杂度 O(n),空间复杂度 O(n)