面试经典150题 -- 哈希表(总结)

总的链接

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

383 . 赎金信

用哈希表模拟 ;

用两个长为26的整数数组模拟哈希表,分别统计r和m中的频次,如果在m中字符出现的都比r中的小,那么m一定能够由r构成,否则,返回false;

class Solution {
public:bool canConstruct(string r, string m) {int a[26] , b[26] ;for(int i=0;i<26;i++){a[i] = 0 ;b[i] = 0 ;}for(char c : r){a[(int)(c-'a')]++;}for(char c : m){b[(int)(c-'a')]++;}for(int i=0;i<26;i++){if(a[i] > b[i]) return false;}return true ;}
};

205 同构字符串

哈希表模拟,一遍遍历,如果发生与之前映射产生冲突,直接返回false;

class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> st;unordered_map<char,char> ts;int n = s.size();for(int i=0;i<n;i++){char a = s[i];char b = t[i];// 有冲突就直接返回false;if((st.count(a) && st[a] != b) || (ts.count(b) && ts[b] != a)) return false;st[a] = b;ts[b] = a;}return true;}
};

290 单词规律

与上题一样的思路 ;

class Solution {
public:bool wordPattern(string pattern, string s) {unordered_map<string,char> stc;unordered_map<char,string> cts;int m = s.size();int i = 0;for(auto ch : pattern){if(i>=m) return false;int j = i;while(j<m && s[j] != ' ') j++;const string &tmp = s.substr(i,j-i);if(stc.count(tmp) && stc[tmp] != ch) return false;if(cts.count(ch) && cts[ch] != tmp) return false;stc[tmp] = ch;cts[ch] = tmp;i = j + 1; }return i>=m;}
};

242 . 有效的字母异位词

用两个数组来分别统计s和t中每种字母的出现频次,最后遍历判断即可 ;

class Solution {
public:bool isAnagram(string s, string t) {int sn[26] = { 0 } ;int tn[26] = { 0 } ;for(char c : s) sn[c-'a']++;for(char c : t) tn[c-'a']++;for(int i=0;i<26;i++){if(sn[i]!=tn[i]) return false;}return true;}
};

49 . 字母异位词分组

用一个unordered_map<string,vector<string>> mp,key存排序后的字符串,value存原来的字符串,一遍遍历,将排序之后相同的字符串全部加入到map[s]中,然后用vector<vector<string>>来返回结果 ;

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ans;unordered_map<string,vector<string>> smap;for(string s : strs){string tmp = s;sort(tmp.begin(),tmp.end());smap[tmp].emplace_back(s);}for(auto it = smap.begin();it!=smap.end();it++){ans.emplace_back(it->second);}return ans;}
};

1 . 两数之和

用一个哈希表(map)来存元素的值和对应的下标,题目要求nums[i]+nums[j]=target , 然后遍历的过程中对于nums[j],如果在之前的哈希表中能够找到target-nums[j],那么直接返回即可;

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int , int> mp ;int n = nums.size() ;for(int i = 0 ; i < n ; i ++){int x = target - nums[i] ;if(mp.find(x) != mp.end()){return {mp[x] , i};}mp[nums[i]] = i;}return {} ;}
};

202 . 快乐数

哈希表模拟,如果遇到之前已经遇到过的,那么就会死循环 ;

class Solution {
public:int getsum(int n){int sum = 0;while(n){sum += pow(n%10,2);n /= 10;}return sum;}bool isHappy(int n) {unordered_set<int> s;while(1){int sum = getsum(n);if(sum==1) return true;if(s.find(sum)!=s.end()) return false;else s.insert(sum);n = sum;}}
};

219 . 存在重复元素

哈希表加滑动窗口

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {int n = nums.size();unordered_set<int> s;for(int i=0;i<n;i++){if(i>k) s.erase(nums[i-k-1]);if(s.count(nums[i])) return true;s.emplace(nums[i]);}return false;}
};

128 . 最长连续序列

法一(双指针)

先排序 + 去重,然后用双指针模拟

class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size()==0) return 0 ;sort(nums.begin(),nums.end()) ;nums.erase(unique(nums.begin(),nums.end()),nums.end()) ;int ans = 1  , n = nums.size();for(int i=0;i<n;i++){int j = i + 1;while(j<n && nums[j]-nums[j-1]==1){j++;}ans = max(ans , j-i);i = j - 1 ;}return ans ;}
};

 法二(哈希表):

O(n),先用哈希表将所有元素存下来,然后一遍遍历,在遍历的过程中,对每个序列开头,进行判断;

详细实现请看代码 : 

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> num_set;for (const int& num : nums) {num_set.insert(num);}int longestStreak = 0;for (const int& num : num_set) {if (!num_set.count(num - 1)) {int currentNum = num;int currentStreak = 1;while (num_set.count(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = max(longestStreak, currentStreak);}}return longestStreak;           }
};

法三(dp)

先排序+去重 ;

然后dp找最大长度 ;

class Solution {
public:int longestConsecutive(vector<int>& nums) {int n = nums.size();if(n==0) return 0;sort(nums.begin(),nums.end());// 使用 std::unique 函数移除重复元素,并返回指向新的逻辑结尾的迭代器auto it = std::unique(nums.begin(), nums.end());// 使用容器的 erase 函数擦除重复元素之后的部分nums.erase(it, nums.end());vector<int> dp(n,1);int ans = 0;for(int i=1;i<n;i++){if(nums[i]-nums[i-1] == 1) dp[i]=dp[i-1]+1;}for(int i=0;i<n;i++) ans = max(ans,dp[i]);return ans;}
};
// -1 -1 0 1 3 4 5 6 7 8 9

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

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

相关文章

日志记录——单片机可执行文件合并

一&#xff1a;需求场景 现在有一片单片机&#xff0c;执行程序包括自定义boot和应用程序app, 在将打包好的固件给到生产是有以下问题&#xff0c;由于要通过jlink烧录boot&#xff0c;然后上电启动boot&#xff0c;通过boot烧录初始化程序&#xff0c;过程过于复杂&#xff0…

Web实战丨基于django+hitcount的网页计数器

文章目录 写在前面Django简介主要程序运行结果系列文章写在后面 写在前面 本期内容 基于djangohitcount的网页计数器 所需环境 pythonpycharm或vscodedjango 下载地址 https://download.csdn.net/download/m0_68111267/88795611 Django简介 Django 是一个开源的、基于 …

消息总线在微服务中的应用

直连式配置中心 上一篇文章介绍了 Spring Cloud 中的分布式配置组件 Config&#xff0c;每个服务节点可以从Config Server 拉取外部配置信息。但是似乎还有一个悬而未决的问题&#xff0c;那就是当服务节点数量非常庞大的时候&#xff0c;我们不可能一台一台服务器挨个去手工触…

Linux系统编程:进程

目录 相关指令 ps指令 top指令 相关函数及其示例 getpid() getpid()示例&#xff1a; fork() 示例&#xff1a; 示例2&#xff1a;fork()返回值 Fathers pid is 14532.This is FartherProcess, pid is 14532.This is SonProcess, pid is 14533. vfork() 示例&am…

RabbitMQ下载与安装

一、Docker安装 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 上传到虚拟机中后&#xff0c;使用命令加载镜像即可&#xff1a; docker load -i mq.ta…

Docker上安装配置tomcat

目录 1. 拉取镜像 2. 创建运行镜像 3. 查看是否创建成功 ps&#xff1a;如果出现404错误 tomcat目录结构 1. 拉取镜像 这里使用 tomcat:8.5.40 版本作为安装 docker pull tomcat:8.5.40 2. 创建运行镜像 docker run -d --name tomcat -p 8080:8080 \--privilegedtrue …

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是&#xff0c;紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中&#xff0c;很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心&#xff0c;每个簇一个&#xff0c;并将…

webstorm、vscode、HBuilder配置eslint检查

你们好&#xff0c;我是金金金。 场景 每个人写的代码都有自己所属的风格&#xff0c;所以项目中统一代码风格特别重要&#xff0c;新开的项目中如何快速配置ESLint呢&#xff1f; 安装 npm install --save-dev eslint ----安装eslintnpm install --save-dev eslint-plugin-vu…

事件分发机制:从OnTouchListener开始,按钮变色的Demo

要彻底弄清楚事件分发机制&#xff0c;先要明白OnTouchListener的作用。 我们看下Android 1.6上&#xff0c;OnTouchListener的代码定义&#xff0c;源码在线地址&#xff1a;Android 1.6 sdk4 View.java 可以看到&#xff0c;OnTouchListener就是View类中的一个public接口&am…

django+flask警务案件信息管理系统python-5dg53-vue

1&#xff09;用户在后台页面各种操作可及时得到反馈。 &#xff08;2&#xff09;该平台是提供给多个用户使用的平台&#xff0c;警员使用之前需要注册登录。登录验证后&#xff0c;警员才可进行各种操作[10]。 &#xff08;3&#xff09;管理员用户拥有信息新增&#xff0c;修…

Git 实战场景过程(工作总结篇)

目录 前言1. Git远程仓库建立分支&#xff0c;本地未显示1.1 问题所示1.2 知识补充 2. Git暂存内容切换分支2.1 问题所示2.2 知识补充 3. Git放弃修改数据3.1 问题所示3.2 知识补充 4. git merge合并查看差异 前言 主要总结工作中的疑惑点&#xff0c;如果你也有相应的场景&am…

跟着cherno手搓游戏引擎【19】抽象纹理

引入&#xff1a; 导入stb_image: GitHub - nothings/stb: stb single-file public domain libraries for C/C 下载复制stb_image.h的内容&#xff08;8000多行&#xff09;&#xff0c;然后粘到如图位置 stb_image.cpp: #include"ytpch.h" #define STB_IMAGE_IM…

【Java】MybatisPlus入门

学习目标 能够基于MyBatisPlus完成标准Dao开发 能够掌握MyBatisPlus的条件查询 能够掌握MyBatisPlus的字段映射与表名映射 能够掌握id生成策略控制 能够理解代码生成器的相关配置 一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 Sp…

部署实战--修改jar中的文件并重新打包成jar文件

一.jar文件 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的一种文档格式JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中&#xff0c;多出了一个META-INF/MANIFEST.MF 文件META-INF/MANIFEST.MF 文件在生成 JAR 文件的时候…

DPVS 多活部署架构部署

一、目标 利用DPVS部署一个基于OSPF/ECMP的提供HTTP服务的多活高可用的测试环境。 本次部署仅用于验证功能&#xff0c;不提供性能验证。 配置两台DPVS组成集群、两台REAL SERVER提供实际HTTP服务。 注&#xff1a;在虚拟环境里面&#xff0c;通过在一台虚拟服务器上面安装FR…

flinkjar开发 自定义函数

编写自定义加密函数&#xff0c;继承ScalarFunction类&#xff0c;实现eval方法&#xff0c;参数个数类型和返回值根据业务来自定义。 import org.apache.flink.table.functions.ScalarFunction; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax…

ELK集群搭建(基础教程)

ELK集群搭建(基础教程) 目录&#xff1a; 机器准备 集群内各台机器安装Elasticsearch 安装部署Kafka&#xff08;注&#xff1a;每个节点都配置&#xff0c;注意ip不同&#xff09; 安装logstash工具 安装filebeat ELK收集Nginx的json日志 ELK收集Nginx正常日志和错误日…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TimePicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 编辑 二、TimePicker组件 TextClock组件通过文本将当前系统时间显示在设备上。…

华为配置使用SNMPv1与网管通信示例

配置使用SNMPv1与网管通信示例 组网图形 图1 配置使用SNMPv1与网管通信组网图 SNMP简介配置注意事项组网需求配置思路操作步骤配置文件 SNMP简介 简单网络管理协议SNMP&#xff08;Simple Network Management Protocol&#xff09;是广泛应用于TCP/IP网络的网络管理标准协议。S…

AJAX-接口文档

接口文档&#xff1a;由后端提供的描述接口的文章 接口&#xff1a;使用AJAX和服务器通讯时&#xff0c;使用的URL&#xff0c;请求方法&#xff0c;以及参数 1.请求参数的位置为query&#xff08;查询&#xff09;的时候&#xff0c;就说明要使用params写为查询参数 2.请求参…