前端js学算法-实践

1、两数之和
const twoSum = (nums, target) => {const obj = {}for (let m = 0; m < nums.length; m++) {const cur = nums[m]const diff = target - curif(obj.hasOwnProperty(diff)){ // 查询对象中是否存在目标值-当前值键值对console.log([obj[diff], m]) // 存在则直接获取差值key对应的值,即索引。m为当前索引break}else{obj[cur] = m // 存储当前值和当前索引}}
}const twoSum = (nums, target) => {const obj = new Map()for (let m = 0; m < nums.length; m++) {const cur = nums[m]const diff = target - curif(obj.has(diff)){console.log([obj.get(diff), m])break}else{obj.set(cur, m)}}
}twoSum([1,2,3,4,5,6,76], 9) // [3, 4]
twoSum([3,3], 6)            // [0, 1]
twoSum([1,2,3,4,5,6,3], 6)  // [1, 3]
2、字母异位词
var strs = ["eat", "tea", "tan", "ate", "nat", "bat"];
var obj = {};
var groupAnagrams = function () {strs.forEach((item) => {const st = item.split("").sort().join("");if (!obj[st]) obj[st] = new Set();obj[st].add(item);});var res = [];Object.values(obj).forEach((item) => {res.push([...item]);});console.log(res);
};
groupAnagrams();
// Output: [ [ 'eat', 'tea', 'ate' ], [ 'tan', 'nat' ], [ 'bat' ] ]
3、最长连续序列
var longestConsecutive = function(nums) {const numsNew = new Set(nums.sort((a,b) => a - b))const arr = []const numsNewList = [...numsNew]numsNewList.forEach((val, index) =>{const nextval = numsNewList[index + 1]const arrlen = arr.lengthconst arrLast = arr[arrlen - 1]if(arrLast){const arrLastlen = arrLast.lengthconst arrLastVal = arrLast[arrLastlen - 1]if(arrLastVal + 1 === val){arrLast.push(val)}else{arr.push([val])}}else{arr.push([val])}})const aaa = arr.sort((a, b) => b.length - a.length);return aaa[0].length
}
4、哈希表与链表

        哈希表是无序的快速查找工具,链表是有序的动态序列容器

    哈希表:

核心特性

  1. 无序性
    • 元素的存储位置由哈希函数计算决定,与插入顺序无关。
    • 遍历时元素的顺序不可预测(取决于哈希桶的分布)。
  2. 快速访问
    • 通过键(Key)直接定位值(Value),时间复杂度接近 O(1)
  3. 存储结构
    • 底层通常是数组 + 链表/红黑树(解决哈希冲突)。
  4. 典型应用
    • 字典、缓存、快速查找场景(如数据库索引)。

js中的对象是基于哈希表结构的,而哈希表的查找时间复杂度为O(1),访问方式:直接通过键访问(O(1))。所以很多人喜欢用对象来做映射,减少遍历循环。

利用数组索引快速查找数据的特性,无序(由哈希函数决定),通过实现一个hash函数将key转化为唯一的索引,对应数组中的一个位置。所以具有快速存取删数据的特性

      优点:

  1. 高效的查找:哈希表可以在常数时间复杂度内进行查找操作,即 O(1)。这使得它在需要快速查询数据的场景中非常有用。

  2. 快速的插入和删除:哈希表同样可以在常数时间复杂度内执行插入和删除操作,这使得它非常适合需要频繁更新数据的场景。

  3. 空间利用率高:哈希表可以根据实际数据量动态调整大小,以尽可能减少内存的使用。

  4. 编码简单:哈希表的实现相对简单,只需设计一个合适的哈希函数即可

      缺点: 

  1. 冲突处理:当两个不同的键被映射到同一个索引位置时,会发生冲突。解决冲突的方法有很多种,但不同的方法对性能的影响也不同。

  2. 哈希函数的选择:选择一个好的哈希函数对于避免冲突以及提高性能至关重要。如果选择的哈希函数不好,可能会导致冲突增多或者性能下降。

  3. 不支持顺序访问:与数组或链表不同,哈希表中的元素没有特定的顺序。如果需要按照某种顺序访问元素,可能需要对哈希表进行额外的处理

	class HashTable {size: numbertable: any[]constructor(size: number) {this.size = sizethis.table = Array.from({length: size}, () => [])}hash(key: string) {let h = 0for (let i = 0; i < key.length; i++) {h += key.charCodeAt(i)}return h % this.size}// 设置和更新set(key, value) {const index = this.hash(key)let bucket = this.table[index]const cur = bucket?.find(item => item.key === key)if (cur) {cur.value = value} else {bucket = []bucket.push({key, value})}}get(key: string) {const index = this.hash(key)const bucket = this.table[index]const cur = bucket?.find(item => item.key === key)return	cur ? cur.value : null}delete(key: string) { const index = this.hash(key)const bucket = this.table[index]const findex = bucket?.findIndex(item => item.key === key)if (findex !== -1) {this.table.splice(findex, 1)return true} else {return false }}has(key) {return !!this.get(key)}}const hashtable = new HashTable(100)hashtable.set('name', 'zhangsan')hashtable.set('age', '20')
    链表:

核心特性

  1. 有序性(按插入顺序)
    • 元素通过节点指针显式连接,遍历顺序始终是插入顺序。
    • 若需要排序,需额外维护(如有序链表)。
  2. 顺序访问
    • 查找元素必须从头节点开始遍历,时间复杂度为 O(n)
  3. 存储结构
    • 节点包含数据(Data)和指针(Next/Prev)。
  4. 典型应用
    • 需要频繁插入/删除的场景(如LRU缓存淘汰算法)

链表格是一种线性数据结构,类似于数组,有序(按插入顺序或显式排序),  访问方式:顺序遍历(O(n))

。但不像数组的元素存储在特定的存储器位置或索引中,链表格的每个元素都是一个独立的对象,其中包含一个指针或链接指向列表中的下一个对象。

每一个元素(通常 称为节点)包含两个项目:存储的数据和到下一个节点的链接,这些数据可以是任何有效数据类型

    优点:

        可以很容易地从链表中删除或添加节点,而无需重组整个数据结构。这是它相对于数组的一个优势

  • 动态内存分配:链表不需要在创建时就确定大小,它可以根据需要动态地增加或减少节点,这使得内存利用更加灵活。

  • 插入和删除效率高:在链表中添加或删除节点时,只需要修改相关节点的指针,不必像数组那样移动大量元素,这样操作起来更快。

  • 灵活性:链表可以轻松地实现各种复杂的数据结构,如双向链表、循环链表等,为不同的算法实现提供了便利

    缺点:

        链表的搜索操作很慢,与数组不同,不允许随机访问数据元素,必须从第一个节点开始按顺序访问节点。由于需要储存指针,相较于数组需要更多内存,

  • 访问效率低:链表不支持随机访问,访问特定位置的节点需要从头开始遍历,这在数据量大时会影响效率1。

  • 额外的内存开销:每个链表节点都需要额外的存储空间来存储指针,这与数组相比是一种空间上的浪费

	class Node{datanextconstrucotr(data) { this.data = data;this.next = null}}class linkedList{headsizeconstryctor() {this.head = nullthis.size = 0}append(data) { const node = new Node(data)if (!this.head) {this.head = node} else {const current = this.headwhile (current.next) {current = current.next}current.next = node}this.size++}// get(data){ // 	const head = this.head// 	while (head.next) {// 		if (head.data === data) {// 			return head.next// 		}// 	}// }delete (data){ if (!this.hear) returnif (this.head.data === data) {this.head = this.head.next} else {let current = this.headlet prev = nullwhile (current && current.data !== data) {current = current.nextprev = current}if (current) {prev.next = current.next}}this.size--}}

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

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

相关文章

《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用声音合成玩音乐:MATLAB电子琴制作(超级趣味实践版)

《MATLAB实战训练营&#xff1a;从入门到工业级应用》趣味入门篇-用声音合成玩音乐&#xff1a;MATLAB电子琴制作&#xff08;超级趣味实践版&#xff09; 开篇&#xff1a;当MATLAB遇见音乐 - 一场数字与艺术的浪漫邂逅 想象一下&#xff0c;你正坐在一台古老的钢琴前&#x…

实战探讨:为什么 Redis Zset 选择跳表?

在了解了跳表的原理和实现后&#xff0c;一个常见的问题&#xff08;尤其是在面试中&#xff09;随之而来&#xff1a;为什么像 Redis 的有序集合 (Zset) 这样的高性能组件会选择使用跳表&#xff0c;而不是大家熟知的平衡树&#xff08;如红黑树&#xff09;呢&#xff1f; 对…

数据结构-线性结构(链表、栈、队列)实现

公共头文件common.h #define TRUE 1 #define FALSE 0// 定义节点数据类型 #define DATA_TYPE int单链表C语言实现 SingleList.h #pragma once#include "common.h"typedef struct Node {DATA_TYPE data;struct Node *next; } Node;Node *initList();void headInser…

高中数学联赛模拟试题精选学数学系列第3套几何题

△ A B C \triangle ABC △ABC 的内切圆 ⊙ I \odot I ⊙I 分别与边 B C BC BC, C A CA CA, A B AB AB 相切于点 D D D, E E E, F F F, D D ′ DD DD′ 为 ⊙ I \odot I ⊙I 的直径, 过圆心 I I I 作直线 A D ′ AD AD′ 的垂线 l l l, 直线 l l l 分别与 D E DE…

使用 ossutil 上传文件到阿里云 OSS

在处理文件存储和传输时&#xff0c;阿里云的对象存储服务&#xff08;OSS&#xff09;是一个非常方便的选择。特别是在需要批量上传文件或通过命令行工具进行文件管理时&#xff0c;ossutil提供了强大的功能。本文将详细说明如何使用 ossutil 上传文件到阿里云 OSS&#xff0c…

DeepSeek与MySQL:开启数据智能新时代

目录 一、引言&#xff1a;技术融合的力量二、DeepSeek 与 MySQL&#xff1a;技术基石2.1 DeepSeek 技术探秘2.2 MySQL 数据库深度解析 三、DeepSeek 与 MySQL 集成&#xff1a;从理论到实践3.1 集成原理剖析3.2 集成步骤详解 四、应用案例&#xff1a;实战中的价值体现4.1 电商…

WebAPI项目从Newtonsoft.Json迁移到System.Text.Json踩坑备忘

1.控制器层方法返回类型不能为元组 控制器层方法返回类型为元组时&#xff0c;序列化结果为空。 因为元组没有属性只有field&#xff0c;除非使用IncludeFields参数专门指定&#xff0c;否则使用System.Text.Json进行序列化时不会序列化field var options new JsonSerializ…

202553-sql

目录 一、196. 删除重复的电子邮箱 - 力扣&#xff08;LeetCode&#xff09; 二、602. 好友申请 II &#xff1a;谁有最多的好友 - 力扣&#xff08;LeetCode&#xff09; 三、176. 第二高的薪水 - 力扣&#xff08;LeetCode&#xff09; 一、196. 删除重复的电子邮箱 - 力扣…

Spring Boot的GraalVM支持:构建低资源消耗微服务

文章目录 引言一、GraalVM原生镜像技术概述二、Spring Boot 3.x的GraalVM支持三、适配GraalVM的关键技术点四、构建原生镜像微服务实例五、性能优化与最佳实践总结 引言 微服务架构已成为企业应用开发的主流模式&#xff0c;但随着微服务数量的增加&#xff0c;资源消耗问题日…

pip 常用命令及配置

一、python -m pip install 和 pip install 的区别 在讲解 pip 的命令之前&#xff0c;我们有必要了解一下 python -m pip install 和 pip install 的区别&#xff0c;以便于我们在不同的场景使用不同的方式。 python -m pip install 命令使用 python 可执行文件将 pip 模块作…

Vue高级特性实战:自定义指令、插槽与路由全解析

一、自定义指令 1.如何自定义指令 ⑴.全局注册语法 通过 Vue.directive 方法注册&#xff0c;语法格式为&#xff1a; Vue.directive(指令名, {// 钩子函数&#xff0c;元素插入父节点时触发&#xff08;仅保证父节点存在&#xff0c;不一定已插入文档&#xff09;inserted(…

本地大模型编程实战(32)用websocket显示大模型的流式输出

在与 LLM(大语言模型) 对话时&#xff0c;如果每次都等 LLM 处理完毕再返回给客户端&#xff0c;会显得比较卡顿&#xff0c;不友好。如何能够像主流的AI平台那样&#xff1a;可以一点一点吐出字符呢&#xff1f; 本文将模仿后端流式输出文字&#xff0c;前端一块一块的显示文字…

人工智能-深度学习之卷积神经网络

深度学习 mlp弊端卷积神经网络图像卷积运算卷积神经网络的核心池化层实现维度缩减卷积神经网络卷积神经网络两大特点卷积运算导致的两个问题&#xff1a;图像填充&#xff08;padding&#xff09;结构组合问题经典CNN模型LeNet-5模型AlexNet模型VGG-16模型 经典的CNN模型用于新…

蓝桥杯电子赛_继电器和蜂鸣器

目录 一 前言 二 继电器和蜂鸣器实物 三 分析部分 &#xff08;1&#xff09;bsp_init.c &#xff08;2&#xff09;蜂鸣器和继电器原理图 &#xff08;3&#xff09;ULN2003 &#xff08;4&#xff09;他们俩所连接的锁存器 四 代码 在这里要特别说一点&#xff01;&…

仿腾讯会议——主界面设计创建房间加入房间客户端实现

1、实现腾讯会议主界面 2、添加Qt类WeChatDialog 3、定义创建会议和加入会议的函数 4、实现显示名字、头像的函数 调用函数 5、在中间者类中绑定函数 6、实现创建房间的槽函数 7、实现加入房间的槽函数 8、设置界面标题 9、服务器定义创建和进入房间函数 10、服务器实现创建房间…

网络编程初识

注&#xff1a;此博文为本人学习过程中的笔记 1.socket api 这是操作系统提供的一组api&#xff0c;由传输层向应用层提供。 2.传输层的两个核心协议 传输层的两个核心协议分别是TCP协议和UDP协议&#xff0c;它们的差别非常大&#xff0c;编写代码的风格也不同&#xff0c…

【质量管理】现代TRIZ问题识别中的功能分析——功能模型

功能模型的定义 功能模型是对工程系统进行功能分析的一个阶段&#xff0c;目的是建立工程系统的功能模型。功能模型描述了工程系统和超系统组件的功能&#xff0c;包括有用功能、性能水平和成本等。 在文章【质量管理】现代TRIZ中问题识别中的功能分析——相互接触分析-CSDN博客…

广告事件聚合系统设计

需求背景 广告事件需要进行统计&#xff0c;计费&#xff0c;分析等。所以我们需要由数据接入&#xff0c;数据处理&#xff0c;数据存储&#xff0c;数据查询等多个服务模块去支持我们的广告系统 规模上 10000 0000个点击&#xff08;10000 00000 / 100k 1wQPS&#xff09; …

C语言中,sizeof关键字(详细介绍)

目录 ‌1. 基本用法‌(1) ‌基本数据类型‌(2) ‌变量‌(3) ‌数组‌(4) ‌指针‌ ‌2. 特殊用法‌(1) ‌结构体与内存对齐‌(2) ‌动态内存分配‌(3) ‌表达式‌ ‌3. 注意事项‌‌1&#xff09;sizeof 与 strlen 的区别‌&#xff1a;‌2&#xff09;变长数组&#xff08;VLA…

ADK 第三篇 Agents (LlmAgent)

Agents 在智能体开发套件&#xff08;ADK&#xff09;中&#xff0c;智能体&#xff08;Agent&#xff09;是一个独立的执行单元&#xff0c;旨在自主行动以实现特定目标。智能体能够执行任务、与用户交互、使用外部工具&#xff0c;并与其他智能体协同工作。 在ADK中&#x…