LeetCode 242.有效的字母异位词
📖 考察点
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。
📖 题意理解
哈希表 数组模拟哈希表
💡 解题思路
思路: 数组模拟哈希表
🔑 关键点总结
用一个26位的数组模拟哈希表,便历两个字符串 ,第一次++,第二次--,最后数组应该所有值都为0
💻 代码实现
JavaScript
Rust
pub fn is_anagram(s: String, t: String) -> bool {
if s.len() != t.len() {
return false;
}
let mut res = [0; 26];
for ch in s.chars() {
res[ch as usize - 'a' as usize] += 1;
}
for ch in t.chars() {
res[ch as usize - 'a' as usize] -= 1;
}
res.iter().all(|&num| num == 0)
}
⏱️ 复杂度分析
📚 总结与反思
LeetCode 349. 两个数组的交集
📖 考察点
给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
📖 题意理解
求数组交集
💡 解题思路
思路:Set去重
🔑 关键点总结
💻 代码实现
JavaScript
var intersection = function(nums1, nums2) {
let set = new Set(nums1);
let resSet = new Set();
nums2.forEach(num=>{
if(set.has(num)){
resSet.add(num);
}
})
return Array.from(resSet);
};
Rust
⏱️ 复杂度分析
📚 总结与反思
LeetCode 202. 快乐数
📖 考察点
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
📖 题意理解
用set记录结果,如果出现过就返回false
💡 解题思路
思路1:用set记录
思路2:快慢指针
🔑 关键点总结
💻 代码实现
JavaScript
var isHappy = function(n) {
let set = new Set();
set.add(n);
while(n!==1){
let temp = n;
let sum = 0;
while(temp>=1){
let t = temp % 10;
sum += t*t;
temp = ~~(temp/10);
}
if(set.has(sum)){
return false;
}
set.add(sum);
n = sum;
}
return true;
};
fn is_happy(n: i32) -> bool {
fn next_number(mut num: i32) -> i32 {
let mut sum = 0;
while num > 0 {
let digit = num % 10;
sum += digit * digit;
num /= 10;
}
sum
}
let mut slow = n;
let mut fast = next_number(n);
while fast != 1 && slow != fast {
slow = next_number(slow);
fast = next_number(next_number(fast));
}
fast == 1
}
⏱️ 复杂度分析
📚 总结与反思
在判圈算法中,初始化时让快指针先走一步(即 fast = next_number(n))是为了避免初始状态下快慢指针就处于相同位置(都指向 n),从而导致算法直接退出循环,无法正确检测循环。
LeetCode 1. 两数之和
📖 考察点
map的使用
📖 题意理解
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
💡 解题思路
使用map存一下差值,如果在便历时存在这个值就返回结果。
思路一:
思路二:
🔑 关键点总结
💻 代码实现
JavaScript
var twoSum = function(nums, target) {
let map = new Map();
for(let i=0;i<nums.length;i++){
if(map.has(nums[i])){
return [i,map.get(nums[i])];
}else{
map.set(target-nums[i],i);
}
}
return null;
};
Rust
use std::collections::HashMap;
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
let mut map = HashMap::new();
let mut res = vec![];
for (i, &num) in nums.iter().enumerate() {
if let Some(&j) = map.get(&num) {
res.push(i as i32);
res.push(j as i32) ;
} else {
map.insert(target - num, i);
}
}
res
}