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

news/2024/4/27 11:00:17/文章来源:https://blog.csdn.net/karshey/article/details/128000409

文章目录

    • 代码随想录
    • 主要题目
      • 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后keymap1.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 truelet array=new Array(26).fill(0);let base='a'.charCodeAt();// magazinefor(let i of magazine){let num=i.charCodeAt()-base;array[num]++;}// ransomNotefor(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:Stringlet key = array.toString();// value:Arraylet 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;// 计算pfor (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.luyixian.cn/news_show_224921.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python遥感开发之GDAL读写遥感影像

Python遥感开发之GDAL读写遥感影像1 读取tif信息方法一2 读取tif信息方法二3 自己封装读取tif的方法&#xff08;推荐&#xff09;4 对读取的tif数据进行简单运算5 写出tif影像(推荐)前言&#xff1a;主要介绍了使用GDAL读写遥感影像数据的操作&#xff0c;包括读取行、列、投影…

从零学习 InfiniBand-network架构(八) —— IB协议中的原子操作

从零学习 InfiniBand-network架构&#xff08;八&#xff09; —— IB协议中的原子操作 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-net…

Docker——容器命令介绍、创建Nginx容器与Redis容器

目录 一、容器命令 二、创建并运行Nginx容器 1.1 去dockerhub查看Nginx容器运行命令 1.2 怎么访问Nginx&#xff1f; 1.3 查看容器日志 1.4总结 三、进入Nginx容器并修改HTML内容 3.1 进入容器 3.2 进入Nginx的HTML所在目录 3.3 修改index.html文件&#xff08;容器内修…

【OpenEVSE 】汽车充电桩控制项目解析

【OpenEVSE 】汽车充电桩控制项目解析1. 项目介绍2. 项目硬件3. 软件原理以及流程4. 系统结构&#xff1a;ESP32RAPI APIMQTT 上的 RAPI:5. SAE J1772协议简析&#xff1a;6. 专用充电接插件7 . 源码解析&#xff1a;此项目来源于openEnergyMonitor 的 openEVSE 部分&#xff0…

查阅必备----常用的SQL语句,配语句和图解超详细,不怕你忘记

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐查阅必备–常用的SQL语句⭐ 文章目录⭐查阅必备--常用的SQL语句⭐一&#xff0c;关键语句大全&am…

python离线安装module以及常见问题及解决方案

文章目录一&#xff0c;离线安装module1.1 下载module1.2 离线安装二&#xff0c;常见的问题2.1 模块缺少合适的适配&#xff1a;error: Could not find suitable distribution for Requirement.parse()2.2 install成功但发现控制台打印的最后一行显示下载module版本为0.0.0工作…

微信商城小程序怎么开发_分享微信商城小程序的搭建

如何搭建好一个微信商城&#xff1f;这三个功能要会用&#xff01; 1.定期低价秒杀&#xff0c;提高商城流量 除了通过私域流量裂变&#xff0c;低价秒杀是为商城引流提高打开率的良好手段。 以不同节日作为嘘头&#xff0c;在情人节、38妇女节、中秋国庆、七夕节等日子&…

机器学习-回归模型相关重要知识点

目录01 线性回归的假设是什么&#xff1f;02 什么是残差&#xff0c;它如何用于评估回归模型&#xff1f;03 如何区分线性回归模型和非线性回归模型&#xff1f;04 什么是多重共线性&#xff0c;它如何影响模型性能&#xff1f;05 异常值如何影响线性回归模型的性能&#xff1f…

R语言结课及Matlab开始

R语言结课 我们R语言的学习这节课下课就结束了&#xff0c;接下来进行Matlab的学习。下面我会说一下R的结课任务及如何考试&#xff0c;以及我自己整理的Matlab安装教程。 R的结课作业&#xff1a;周二上课时提到的两个回归模型课程总结&#xff08;老师说作业总结主要是作业…

通过ref进行组件间的通信

ref&#xff1a;绑定dom节点&#xff0c;拿到的就是dom对象&#xff1b; ref&#xff1a;绑定组件&#xff0c;拿到的就是组件对象&#xff1b; ref绑在dom节点上&#xff1a; //绑在dom上&#xff0c; <input type"text" ref"mytext"> <input…

SpringBoot SpringBoot 开发实用篇 6 监控 6.3 actuator

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.3 actuator6.3.1 actuator6.3.2 监控原理6.3.3 小结6 监控 …

IOS逆向初探

前言 这些文章用于记录学习路上的点点滴滴&#xff0c;也希望能给到刚入门的小伙伴们一点帮助。爱而所向&#xff0c;不负所心。 环境 iphone 6 MacOS Monterey 12.3.1 一、IOS开发语言 Objective-C Objective-C是iOS操作系统运用的软件开发语言。Objective-C的流行完全是因…

Flutter高仿微信-第21篇-支付-向商家付款(二维码)

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.…

【Hack The Box】Linux练习-- Knife

HTB 学习笔记 【Hack The Box】Linux练习-- Knife &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

【计算机网络】Servlet API重点知识汇总

目录 1.HttpServlet&#xff1a; 2.HttpServletRequest&#xff1a; 3.HttpServletRequest代码实例&#xff1a; 3.1.打印请求的内容&#xff1a; 3.2.获取请求中的重要参数 &#xff08;query string中的值&#xff09;&#xff1a; 3.3.获取请求中的重要参数 &#x…

用HTML+CSS仿网易云音乐网站(6个页面)_实训素材

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 音乐网页设计 | 仿网易云音乐 | 各大音乐官网网页 | 明星音乐演唱会主题 | 爵士乐音乐 | 民族音乐 | 等网站的设计与制作 | HTML期末大学生网页设计作…

【安装教程】vscode安装教程(超详细)

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全、代码重构功能&#xff0c;并且内置了命令行工具和 Git版本控制系统。用户可以更改主题和键盘快捷方式实现个性化设置&#xff0c;也可以…

SpringBoot SpringBoot 开发实用篇 6 监控 6.5 health 端点指标控制

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.5 health 端点指标控制6.5.1 问题引入6.5.2 health 端点指标…

还有人以为高并发=多线程吗?跟着大佬带你了解二者关系与区别,面试难题轻松拿下!

高并发和多线程的关系 “高并发和多线程”总是被一起提起&#xff0c;给人感觉两者好像相等&#xff0c;实则高并发≠多线程 多线程是完成任务的一种方法&#xff0c;高并发是系统运行的一种状态&#xff0c;通过多线程有助于系统承受高并发状态的实现。 高并发是一种系统运…

Android 10.0 11.0 12.0 启动模拟器教程

Android 10.0 11.0 12.0 启动模拟器教程 一、android 12.0 模拟器二、创建模拟器设备三、创建删除路经文件夹avd和配置环境变量四、启动模拟器一、android 12.0 模拟器 Android 10.0 11.0 12.0 启动模拟器都行,我选择android 12.0 模拟器 二、创建模拟器设备 第一步骤:在 …