【LeetCode与《代码随想录》】哈希表篇:做题笔记与总结-JavaScript版

news2025/8/10 1:03:16

文章目录

    • 代码随想录
    • 主要题目
      • 242. 有效的字母异位词
      • 349. 两个数组的交集
      • 202. 快乐数
      • 1. 两数之和(经典哈希)
      • 454. 四数相加 II
      • 15. 三数之和(双指针)
      • 18. 四数之和(双指针)
    • 相关题目
      • 383. 赎金信
      • 49. 字母异位词分组(Array,Map的运用)
      • 438. 找到字符串中所有字母异位词(滑动窗口)
      • 350. 两个数组的交集 II

代码随想录

代码随想录
代码随想录CSDN官方

主要题目

242. 有效的字母异位词

242. 有效的字母异位词

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false;

    let ss = new Array(26).fill(0);
    // base 字母的Unicode编码
    let base = 'a'.charCodeAt();

    for (let i of s) {
        ss[i.charCodeAt() - base]++;
        // console.log(i.charCodeAt()-base);
    }
    for (let i of t) {
        ss[i.charCodeAt() - base]--;
        // console.log(i.charCodeAt()-base);
    }

    let flag = 0;
    ss.forEach(function (item) {
        if (item) {
            flag = 1;
        }
    })
    if (flag) return false;
    return true;
};

349. 两个数组的交集

349. 两个数组的交集

//  在大的里面找小的,set1大
const setIntersection = function (set1, set2) {
    if (set1.length < set2.length) {
        return setIntersection(set2, set1);
    }

    let ans = new Set();
    for (let i of set2) {
        if (set1.has(i)) {
            ans.add(i);
        }
    }

    return Array.from(ans)

}

var intersection = function (nums1, nums2) {
    let set1 = new Set(nums1);
    let set2 = new Set(nums2);
    return setIntersection(set1, set2);
};

202. 快乐数

202. 快乐数

var isHappy = function (n) {
    const happy = function (n) {
        let ans = 0;
        while (n) {
            ans += (n % 10) ** 2;
            // 要向下取整
            n = Math.floor(n / 10);
        }
        return ans;
    }

    let set = new Set();
    while (n != 1) {
        let temp = happy(n);
        if (set.has(temp)) return false;
        else {
            set.add(temp);
            n = temp;
        }
    }
    return true;
};

1. 两数之和(经典哈希)

1. 两数之和

  • 用对象{}来存某个值和它的下标
var twoSum = function (nums, target) {
    // key:值  value:下标
    let obj = {};
    for (let i = 0; i < nums.length; i++) {
        let find = target - nums[i];
        if (obj[find] !== undefined) {
            return [i, obj[find]];
        } else {
            obj[nums[i]] = i;
        }
    }
    return [];
};

454. 四数相加 II

454. 四数相加 II

一个map版:

var fourSumCount = function (nums1, nums2, nums3, nums4) {
    let map1 = new Map();

    for (let i of nums1) {
        for (let j of nums2) {
            let k = i + j;
            let kk = map1.get(k) ? map1.get(k) : 0;
            kk++;
            map1.set(k, kk);
        }
    }

    let ans = 0;
    for (let i of nums3) {
        for (let j of nums4) {
            let k = i + j;
            let find = 0 - k;
            let temp = map1.get(find) ? map1.get(find) : 0;
            ans += temp;
        }
    }

    return ans;
};

两个map和forEach版:注意,forEach参数(value,key)

var fourSumCount = function (nums1, nums2, nums3, nums4) {
    let map1 = new Map();
    let map2 = new Map();

    for (let i of nums1) {
        for (let j of nums2) {
            let k = i + j;
            let kk = map1.get(k) ? map1.get(k) : 0;
            kk++;
            map1.set(k, kk);
        }
    }
    for (let i of nums3) {
        for (let j of nums4) {
            let k = i + j;
            let kk = map2.get(k) ? map2.get(k) : 0;
            kk++;
            map2.set(k, kk);
        }
    }

    let ans = 0;
    // 参数:先value后key
    map1.forEach((value, key) => {
        // value表示key出现的次数
        let find = 0 - key;
        if (map2.has(find)) {
            ans += value * map2.get(find);
        }
    })


    return ans;
};

15. 三数之和(双指针)

15. 三数之和

  • 可以用哈希,但是会很麻烦
  • 所以这里用双指针

思路:来自代码随想录
在这里插入图片描述

var threeSum = function (nums) {
    let ans = [];
    // 从小到大
    nums.sort((a, b) => a - b);
    if (nums[0] > 0) return ans;

    for (let i = 0; i < nums.length; i++) {
        let l = i + 1, r = nums.length - 1;
        if (i && nums[i] === nums[i - 1]) continue;
        while (l < r) {
            let sum = nums[i] + nums[l] + nums[r];
            if (sum > 0) r--;
            else if (sum < 0) l++;
            else {
                ans.push([nums[i], nums[l], nums[r]]);
                // 去重
                while (l < r && nums[l] === nums[l + 1]) {
                    l++;
                }
                while (l < r && nums[r] === nums[r - 1]) {
                    r--;
                }
                l++, r--;
            }
        }
    }

    return ans;
};

18. 四数之和(双指针)

18. 四数之和

var fourSum = function (nums, target) {
    let ans = [];
    const len = nums.length;
    if (len < 4) return ans;
    nums.sort((a, b) => a - b);

    for (let i = 0; i < len - 3; i++) {
        if (i && nums[i] === nums[i - 1]) continue;

        for (let j = i + 1; j < len - 2; j++) {
            if (j > i + 1 && nums[j] === nums[j - 1]) continue;

            let l = j + 1, r = len - 1;
            while (l < r) {
                let sum = nums[i] + nums[j] + nums[l] + nums[r];
                if (sum < target) {
                    l++;
                } else if (sum > target) {
                    r--;
                } else {
                    ans.push([nums[i], nums[j], nums[l], nums[r]]);

                    // 去重
                    while (l < r && nums[l] === nums[l + 1]) {
                        l++;
                    }
                    while (l < r && nums[r] === nums[r - 1]) {
                        r--;
                    }
                    l++; r--;
                }
            }
        }
    }

    return ans;
};

相关题目

是和主要题目类似的题目。

383. 赎金信

383. 赎金信

 var canConstruct = function(ransomNote, magazine) {
    // 如果magazine>=ransomNote true
    let array=new Array(26).fill(0);
    let base='a'.charCodeAt();

    // magazine
    for(let i of magazine){
        let num=i.charCodeAt()-base;
        array[num]++;
    }

    // ransomNote
    for(let i of ransomNote){
        let num=i.charCodeAt()-base;
        array[num]--;
    }

    let flag=0;
    array.forEach(function(item){
        if(item<0){
            flag=1;
        }
    })

    if(flag) return false;
    return true;
};

49. 字母异位词分组(Array,Map的运用)

49. 字母异位词分组

  • 把每个字符串str转换为数组(Array.from
  • 数组排序,得到唯一的key
  • 找到对应的value,添加当前的str
  • 把最后的map转换为array
  • 要熟练运用Array和Map
var groupAnagrams = function (strs) {
    const map = new Map();
    for (let str of strs) {
        // 把str字符串变成数组
        let array = Array.from(str);
        array.sort();
        // key:String
        let key = array.toString();
        // value:Array
        let value = map.get(key) ? map.get(key) : new Array();
        value.push(str);
        map.set(key, value);
    }

    return Array.from(map.values());
};

438. 找到字符串中所有字母异位词(滑动窗口)

438. 找到字符串中所有字母异位词

  • 滑动窗口
var findAnagrams = function (s, p) {
    if (s.length < p.length) return [];

    var compare = function (ss, pp) {
        for (let i = 0; i < 26; i++) {
            if (ss[i] != pp[i]) {
                return false;
            }
        }
        return true;
    }

    // s长p短
    let pp = new Array(26).fill(0);
    let ss = new Array(26).fill(0);
    let ans = new Array();

    // j 慢指针
    let j = 0;

    // 计算p
    for (let char of p) {
        pp[char.charCodeAt() - 'a'.charCodeAt()]++;
    }

    const sl = s.length, pl = p.length;
    for (let i = 0; i < pl; i++) {
        let char = s[i];
        ss[char.charCodeAt() - 'a'.charCodeAt()]++;
    }

    if (compare(ss, pp)) {
        ans.push(0);
    }

    for (let i = pl; i < sl; i++, j++) {
        let char = s[i];
        ss[char.charCodeAt() - 'a'.charCodeAt()]++;
        char = s[j];
        ss[char.charCodeAt() - 'a'.charCodeAt()]--;
        if (compare(ss, pp)) {
            ans.push(j + 1);
        }
    }
    return ans;
};

350. 两个数组的交集 II

350. 两个数组的交集 II

var intersect = function (nums1, nums2) {
    let a1 = new Array(1001).fill(0);
    let a2 = new Array(1001).fill(0);

    for (let i = 0; i < nums1.length; i++) {
        a1[nums1[i]]++;
    }

    for (let i = 0; i < nums2.length; i++) {
        a2[nums2[i]]++;
    }

    let ans = new Array();

    for (let i = 0; i <= 1000; i++) {
        if (a1[i] && a2[i]) {
            let num = Math.min(a1[i], a2[i]);
            for (let j = 0; j < num; j++) {
                ans.push(i);
            }
        }
    }
    return ans;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【构建ML驱动的应用程序】第 9 章 :选择部署选项

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Redis基础命令(set类型)交集并集差集

目录 概述: 特征&#xff1a; Set常见命令&#xff1a; 1.Sadd key number..&#xff1a;向set中添加一个或多个元素 2.Srem key number...&#xff1a;移除set中指定的元素 3.Scard key&#xff1a;返回set中元素的个数 4.Sismember key member&#xff1a;判断一个元素…

liunx中如何启动redis

连上服务器之后&#xff0c;这个“~”’波浪符号应该是在root目录下&#xff0c;我们需要到这个目录的外面&#xff0c;根目录 root目录 目录的外面&#xff0c;根目录 cd .. 变为"/"符号即可 然后再找到redis的安装目录&#xff0c;也可以在xftp中找&#xff0c;可视…

【LeetCode每日一题】——90.子集 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 90.子集 II 四【题目描述】 给你一个整数数组 num…

有没有把语音转为文字的软件?这几个转换软件你值得收藏

我们在日常的工作和生活中&#xff0c;应该经常会遇到需要将音频转换成文字的情况吧。相信大部分的小伙伴都会选择直接使用转换软件进行音频转文字的操作&#xff0c;但在使用的过程中就会发现&#xff0c;有些软件会在使用次数、音频时长上面有所限制&#xff0c;导致我们会转…

【文件格式_XML_HTML_】XML、HTML文件

HTML xml what&#xff1f; XML是被设计用来存储数据、携带数据和交换数据的&#xff0c;通过XML&#xff0c;可以在不兼容的系统之间交换数据&#xff0c;利用XML&#xff0c;纯文本文件可以用来存储数据。在不使用XML时&#xff0c;HTML用于显示数据&#xff0c;数据必须存…

python面向对象(上)

python面向对象上命名规则对象的创建创建类对象创建实例对象修改增加类属性构造方法构造实例方法不带变量带变量构造方法小例子构造类方法构造静态方法运算符的重载比较运算符重载字符串重载索引或切片重载索引或切片重载检查成员重载重载小结持续更新中~~~~~~~~先上个例子&…

莫名其妙: conda使用过程各种错误及总结

conda真的很烦呢&#xff0c;有啥好用的&#xff0c;要不是准备学习一下虚拟环境&#xff0c;我才不折腾呢&#xff0c;浪费好多时间&#xff0c;(&#xff1b;′⌒) 不要挂代理&#xff0c;我怎么知道为什么&#xff0c;和pip一样&#xff0c;不过后来不知道为什么pip很流畅c…

知识蒸馏(Knowledge Distillation)

0.Introduction 知识蒸馏&#xff08;Knowledge Distillation&#xff0c;简记为 KD&#xff09;是一种经典的模型压缩方法&#xff0c;核心思想是通过引导轻量化的学生模型“模仿”性能更好、结构更复杂的教师模型&#xff08;或多模型的 ensemble&#xff09;&#xff0c;在…

第3章:中文本文向量化——代码详解

1.单条语句的向量化 根据不同的向量化&#xff0c;对“中华女子学院&#xff1a;本科层次仅1专业招男生”这句话进行向量化 1.1 One-hot方法 # one-hot代码 import jieba import os import numpy as npstopwords open(./data/哈工大停用词表.txt).read().split("\n&qu…

物联网安全年报暴露情况分析

暴露情况分析 在去年研究的基础上&#xff0c;我们今年对 UPnP 协议的暴露情况进行持续关注。如无特殊说明&#xff0c;本章中的 统计数据基于全球单轮次的测绘&#xff08;2019 年 10 月&#xff09;。本节我们将对 SSDP 与 SOAP服务的暴露情况进行 分析&#xff0c;4.4.2 节…

图床项目架构与设计

分布式文件服务系统架构与设计 该项目利用FastDFS分布式文件系统以及集群等技术提供统一的接口对外提供文件存储和访问服务&#xff0c;使用户能够通过网络访问服务端的文件资源&#xff0c;满足海量数据存储的需求 架构 项目采用B/S模型&#xff0c;服务端与浏览器进行交互&a…

论文阅读-Detecting and Recovering Sequential DeepFake Manipulation(SeqFakeFormer)

一、论文信息 论文名称&#xff1a;Detecting and Recovering Sequential DeepFake Manipulation&#xff08;篡改序列检测还原&#xff09; 论文链接: https://arxiv.org/pdf/2207.02204.pdf 项目主页: https://rshaojimmy.github.io/Projects/SeqDeepFake GitHub: https:…

Linux 最近学习总结

Linux 最近学习总结一.基础命令一.基础命令 基础命令就像是锤子、螺丝刀、锯等木匠常用到的工具&#xff0c;也是我们每天都会用到的命令 1.ls 列出当前所在目录的内容 2.ls 文件夹名 列出其他文件夹内容 3.ls ~ 其中~代表home目录 4.ls ~/Desktop/Java电子书/*.pdf 使用…

Eigen Segmentation fault (core dumped)

不会GDB吃大亏问题描述&#xff1a;解法&#xff1a;写在前面的话&#xff1a;我是PCL新手。也是Cmake新手。Eigen有点折腾人。 问题描述&#xff1a; 在调用PCL库实现一些有趣的功能&#xff0c;考虑到考虑到兼容不同平台&#xff0c;现状如下&#xff1a; VS2015&#xff1…

JavaScript基本语法详解

目录 一、JavaScript数据类型 二、算术运算符 1&#xff1a;分支结构 &#xff08;1&#xff09;if语句 &#xff08;2&#xff09;if...else语句 &#xff08;3&#xff09;if..else if语句 2&#xff1a;循环结构 &#xff08;1&#xff09;for循环 &#xff08;2&a…

ipv6地址概述——了解ipv6地址

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

[ Linux ] 进程间通信之共享内存

在上篇博文我们了解了通过管道完成进程间通信&#xff0c;我们了解匿名管道和命名管道&#xff0c;并且通过编码模拟实现使用了匿名管道和命名管道。我们知道要让进程间完成通信必须让这两个进程首先看到同一份资源&#xff0c;因此给予这个前提&#xff0c;本篇博文我们了解另…

【Linux】自动化构建工具-make/Makefile第一个小程序

大家好我是沐曦希&#x1f495; 文章目录一.项目自动化构建工具-make/Makefile1.背景2. 举例3. 原理4. 总结5. 项目清理6. 习题习题一习题二二.第一个小程序&#xff0d;进度条1.行缓冲区2.倒计时3.进度条一.项目自动化构建工具-make/Makefile 1.背景 会不会写makefile&#x…

使用 elasticdump 跨版本迁移 ES 数据

1、elasticdump 用途介绍 elasticdump 是一个在 Github 开源的 Elasticsearch 的数据迁移工具&#xff0c;项目 Github 地址&#xff1a;[传送门](Github 地址&#xff1a;https://github.com/elasticsearch-dump/elasticsearch-dump) elasticdump 支持跨版本导出和导入数据&am…