前端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.pswp.cn/pingmian/79313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79313.shtml
英文地址,請注明出處:http://en.pswp.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…