代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

26 阅读3分钟

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
}


⏱️ 复杂度分析

📚 总结与反思