当前位置: 首页 > news >正文

跟着《代码随想录》刷题(三)——哈希表

3.1 哈希表理论基础

哈希表理论基础

3.2 有效的字母异位词

242.有效的字母异位词

在这里插入图片描述
C

bool isAnagram(char * s, char * t){int array[26] = {0};int i = 0;while (s[i]) {// 并不需要记住字符的ASCII码,只需要求出一个相对数值就可以了array[s[i] - 'a']++;i++;}i = 0;while (t[i]) {array[t[i] - 'a']--;i++;}for (i = 0; i < 26; i++) {// 如果数组有元素不为0,说明字符串s和t 一定是谁多了字符或者谁少了字符if (array[i] != 0)return false;}// 数组所有元素都为0,说明字符串s和t是字母异位词return true;
}

cpp

class Solution {
public:bool isAnagram(string s, string t) {int array[26] = {0};for (int i = 0; i < s.size(); i++) {array[s[i] - 'a']++;}for (int j = 0; j < t.size(); j++) {array[t[j] - 'a']--;}for (int k = 0; k < 26; k++) {if (array[k] != 0) {return false;}}return true;}
};

383.赎金信

在这里插入图片描述
在这里插入图片描述

c

bool canConstruct(char * ransomNote, char * magazine){int array[26] = {0};if (strlen(ransomNote) > strlen(magazine)) return false;int i = 0;while (magazine[i]) {array[magazine[i] - 'a']++;i++;}i = 0;while(ransomNote[i]) {array[ransomNote[i] - 'a']--;if (array[ransomNote[i] - 'a'] < 0)return false;i++;}return true;
}

cpp

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {if (ransomNote.length() > magazine.length()) {return false;}int array[26] = {0};for (int i = 0; i < magazine.length(); i++) {array[magazine[i] - 'a']++;}for (int j = 0; j < ransomNote.length(); j++) {array[ransomNote[j] - 'a']--;if (array[ransomNote[j] - 'a'] < 0) {return false;}}return true;}
};

49. 字母异位词分组

在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> result;unordered_map<string, vector<string>> map;for (string &s : strs) {string key = s;sort(key.begin(), key.end());map[key].emplace_back(s);}for (auto &it : map) result.emplace_back(it.second);return result;}
};

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

在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<int> findAnagrams(string s, string p) {int len_s = s.length();int len_p = p.length();if (len_s < len_p)return vector<int> ();vector<int> count_s(26);vector<int> count_p(26);vector<int> res;for (int i = 0; i < len_p; i++) {count_s[s[i] - 'a']++;count_p[p[i] - 'a']++;}if (count_s == count_p)res.push_back(0);for (int j = 0; j < len_s - len_p; j++) {count_s[s[j] - 'a']--;count_s[s[j + len_p] - 'a']++;if (count_s == count_p)res.push_back(j + 1); // 注意:这里左边已经移动了一位了,所以要加1}return res;}
};

3.3 两个数组的交集

349. 两个数组的交集

在这里插入图片描述
c语言

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;// 用calloc直接全部初始化为0,malloc则是随机值int *res = calloc(lessSize, sizeof(int));int hash[1001] = {0};for (int i = 0; i < nums1Size; i++) {hash[nums1[i]]++;}int count = 0;for (int j = 0; j < nums2Size; j++) {if (hash[nums2[j]] > 0) {res[count++] = nums2[j];}hash[nums2[j]] = 0;}*returnSize = count;return res;
}

cpp
解法一:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;// 存放结果,之所以用unordered_set,是为了给结果去重unordered_set<int> set(nums1.begin(), nums1.end());for (int num : nums2) {// 发现nums2中的结果在set中出现过if (set.find(num) != set.end()) {result.insert(num);}}return vector<int> (result.begin(), result.end());}
};

解法二:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;int hash[1001] = {0};for (int n1 : nums1) {hash[n1] = 1;}for (int n2 : nums2) {if (hash[n2] == 1) {result.insert(n2);}}return vector<int>(result.begin(), result.end());}
};

350. 两个数组的交集||

C语言

int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){int lessSize = nums1Size < nums2Size ? nums1Size : nums2Size;int* ret = calloc(lessSize, sizeof(int));int hash[1001] = {0};int count = 0;int i;for (i = 0; i < nums1Size; i++) {hash[nums1[i]]++;}for (i = 0; i < nums2Size; i++) {if (hash[nums2[i]] > 0) {ret[count++] = nums2[i];hash[nums2[i]]--;}}*returnSize = count;return ret;
}

C++

class Solution {
public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {unordered_map<int, int> num_map;for (int n1 : nums1) {num_map[n1]++;}vector<int> res;for (int num : nums2) {if (num_map.count(num)) {res.push_back(num);num_map[num]--; if (num_map[num] == 0) {num_map.erase(num);}}}return res;}
};

3.4 快乐数(unordered_set)

202. 快乐数

在这里插入图片描述
在这里插入图片描述

class Solution {
public:int getSum(int n) {int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;}bool isHappy(int n) {if (1 == n)return true;unordered_set<int> sum_set;int sum = 0;while (1) {sum = getSum(n);if (1 == sum)return true;// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return falseif (sum_set.find(sum) != sum_set.end()) {return false;} else {sum_set.insert(sum);n = sum;}}}
};

3.5 两数之和(unorderd_map)

1.两数之和

在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> map;for (int i = 0; i < nums.size(); i++) {int s = target - nums[i];auto iter = map.find(s);// 遍历当前元素,并在map中寻找是否有匹配的keyif (iter != map.end()) {return {iter->second, i};} else {// 如果没找到匹配对,就把访问过的元素和下标加入到map中map.insert(pair<int, int>(nums[i], i));}}return {};}
};

3.6 四数相加||

454. 四数相加||

在这里插入图片描述

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> map; //key:a+b的数值,value:a+b数值出现的次数int target = 0;int count = 0;// 统计a+b+c+d = 0 出现的次数// 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中for (int a : nums1) {for (int b : nums2)map[a + b]++;}// 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,//就把map中key对应的value也就是出现次数统计出来。for (int c : nums3) {for (int d : nums4) {target = 0 - (c + d);if (map.find(target) != map.end()) {count += map[target];}}}return count;}
};

3.7 赎金信

383.赎金信

在这里插入图片描述
在这里插入图片描述

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {if (ransomNote.length() > magazine.length()) return false;int array[26] = {0};for (char s1 : magazine) {array[s1 - 'a']++;}for (char s2 : ransomNote) {array[s2 - 'a']--;if (array[s2 - 'a'] < 0)return false;}return true;}
};

3.8 三数之和

15.三数之和

在这里插入图片描述
在这里插入图片描述

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了for (int i = 0; i < nums.size(); i++) {if (nums[i] > 0) return res;// 正确去重a方法if (i > 0 && nums[i] == nums[i - 1]) continue;int left = i + 1;int right = nums.size() - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (sum > 0) right--;else if (sum < 0)left++;else {res.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重逻辑应该放在找到一个三元组之后,对b 和 c去重while (left < right && nums[right] == nums[right - 1])right--;while (left < right && nums[left] == nums[left + 1])left++;// 找到答案时,双指针同时收缩right--;left++;}}}return res;}
};

3.9 四数之和

18. 四数之和

在这里插入图片描述

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> res;sort(nums.begin(), nums.end());// 一级剪枝for (int k = 0; k < nums.size(); k++) {if (nums[k] > target && nums[k] >=0)break; // 这里使用break,统一通过最后的return返回// 一级去重,对nums[k]去重if (k > 0 && nums[k] == nums[k - 1])continue;for (int i = k + 1; i < nums.size(); i++) {// 二级剪枝if (nums[k] + nums[i] > target && nums[k] + nums[i] >=0)break;// 二级去重,对nums[i]去重if (i > k + 1 && nums[i] == nums[i - 1])continue;int left = i + 1;int right = nums.size() - 1;while (left < right) {// 会溢出long sum = (long)nums[k] + nums[i] + nums[left] + nums[right];if (sum > target)right--;else if (sum < target)left++;else {res.push_back(vector<int>{nums[k], nums[i], nums[left], nums[right]});// 对nums[left]和nums[right]去重while (left < right && nums[right] == nums[right - 1])right--;while (left < right && nums[left] == nums[left + 1])left++;// 找到答案时,双指针同时收缩right--;left++;}}}}return res;}
};

参考:《代码随想录》哈希表

相关文章:

跟着《代码随想录》刷题(三)——哈希表

3.1 哈希表理论基础 哈希表理论基础 3.2 有效的字母异位词 242.有效的字母异位词 C bool isAnagram(char * s, char * t){int array[26] {0};int i 0;while (s[i]) {// 并不需要记住字符的ASCII码&#xff0c;只需要求出一个相对数值就可以了array[s[i] - a];i;}i 0;whi…...

HTML - 扫盲

文章目录1. 前言2. HTML2.1 下载 vscode3 HTML 常见标签3.1 注释标签3.2 标题标签3.3 段落标签3.4 换行标签3.5 格式化标签1. 加粗2. 倾斜3. 下划线3.6 图片标签3.7 超链接标签3.8 表格标签3.9 列表标签4. 表单标签4.1 from 标签4.2 input 标签4.3 select 标签4.4 textarea标签…...

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题&#xff08;25分&#xff09;2022上案例分析历年真题第二题&#xff08;25分&#xff09;2022上案例分析历年真题第…...

Python编程规范

Python编程规范 当今Python编程社区有许多关于编程规范的约定和惯例。以下是一些常见的Python编程规范&#xff1a; 1.使用有意义的命名 使用有意义的命名可以使代码更加清晰、易读、易维护。变量、函数、类和模块的命名应该能够明确传达其用途&#xff0c;而不是使用无意义…...

【Java】Spring Boot项目的创建和使用

文章目录SpringBoot的创建和使用1. 什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f;2. Spring Boot项目的优点3. Spring Boot 项目的创建3.1 使用idea创建3.2 接下来创建Spring Boot项目4. 项目目录介绍和运行4.1 运行项目4.2 输出内容5. 总结SpringBoot的创建…...

Malware Dev 00 - Rust vs C++ 初探

写在最前 如果你是信息安全爱好者&#xff0c;如果你想考一些证书来提升自己的能力&#xff0c;那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里&#xff1a; https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助&#xff0c;并分享学习和实践过程…...

JavaScript HTML DOM 事件

文章目录JavaScript HTML DOM 事件对事件做出反应HTML 事件属性使用 HTML DOM 来分配事件onload 和 onunload 事件onchange 事件onmouseover 和 onmouseout 事件onmousedown、onmouseup 以及 onclick 事件JavaScript HTML DOM 事件 HTML DOM 使 JavaScript 有能力对 HTML 事件做…...

推荐算法——NCF知识总结代码实现

NCF知识总结代码实现1. NeuralCF 模型的结构1.1 回顾CF和MF1.2 NCF 模型结构1.3 NeuralCF 模型的扩展---双塔模型2. NCF代码实现2.1 tensorflow2.2 pytorchNeuralCF&#xff1a;如何用深度学习改造协同过滤&#xff1f; 随着技术的发展&#xff0c;协同过滤相比深度学习模型的…...

redis(4)String字符串

前言 Redis中有5大数据类型&#xff0c;分别是字符串String、列表List、集合Set、哈希Hash、有序集合Zset&#xff0c;本篇介绍Redis的字符串String Redis字符串 String是Redis最基本的类型&#xff0c;你可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value…...

session一致性问题

在http访问请求中&#xff0c;web服务器会自动为同一个浏览器的访问用户自动创建唯一的session&#xff0c;提供数据存储功能。最常见的&#xff0c;会把用户的登录信息、用户信息存储在session中&#xff0c;以保持登录状态。只要用户不重启浏览器&#xff0c;每次http短连接请…...

上岸16K,薪资翻倍,在华为外包做测试是一种什么样的体验····

现在回过头看当初的决定&#xff0c;还是正确的&#xff0c;自己转行成功&#xff0c;现在进入了华为外包测试岗&#xff0c;脱离了工厂生活&#xff0c;薪资也翻了一倍不止。 我17年毕业于一个普通二本学校&#xff0c;电子信息工程学院&#xff0c;是一个很不出名的小本科。…...

django项目中如何添加自定义的django command

项目目录 1.我们自己建立的application叫做app&#xff0c;首先在这个app目录下&#xff0c;我们需要新建management目录&#xff0c;这个目录里应该包括&#xff1a;__ init__.py&#xff08;内容为空&#xff0c;用于打包&#xff09;和commands目录&#xff0c;然后在comma…...

【算法基础】哈希表⭐⭐⭐

一、哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意…...

基于SpringMVC、Spring、MyBatis开发的校园点餐系统

文章目录 项目介绍主要功能截图:后台登录用户管理商品管理评论管理订单管理角色管理咨询管理前台前台首页我的订单商品详情支付方式选择支付成功页面部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题…...

LeetCode 热题 C++ 148. 排序链表 152. 乘积最大子数组 160. 相交链表

力扣148 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#x…...

JavaScript 基础【快速掌握知识点】

目录 为什么要学JavaScript? 什么是JavaScript 特点&#xff1a; 组成&#xff1a; JavaScript的基本结构 基本结构 内部引用 外部引用 console对象进行输出 JavaScript核心语法 1、变量声明 2、数据类型 3、运算符 4、条件语句 5、循环语句 6、数组 7…...

基于Frenet优化轨迹的⾃动驾驶动作规划⽅法

动作规划&#xff08;Motion Control&#xff09;在⾃动驾驶汽⻋规划模块的最底层&#xff0c;它负责根据当前配置和⽬标配置⽣成⼀序列的动作&#xff0c;本⽂介绍⼀种基于Frenet坐标系的优化轨迹动作规划⽅法&#xff0c;该⽅法在⾼速情况下的ACC辅助驾驶和⽆⼈驾驶都具有较强…...

Spring(入门)

1. 什么是spring&#xff0c;它能够做什么?2. 什么是控制反转(或依赖注入)3. AOP的关键概念4. 示例 4.1 创建工程4.2 pom文件4.3 spring配置文件4.4 示例代码 4.4.1 示例14.4.2 示例2 &#xff08;abstract&#xff0c;parent示例&#xff09;4.4.3 使用有参数构造方法创建jav…...

2023-02-25力扣每日一题

链接&#xff1a; https://leetcode.cn/problems/minimum-swaps-to-make-strings-equal/ 题意&#xff1a; 给定字符串s1,s2&#xff0c;仅由x,y组成 每次可以在两边各挑一个字符交换 求让s1等于s2的最小步骤 解&#xff1a; 1000啊1000&#xff0c;双指针贪一下就过了 …...

如何外网登录管理云通信短信网关平台?——快解析映射方案

云通信&#xff08;Cloud Communications &#xff09;是基于云计算商业模式应用的通信平台服务&#xff0c;简单易用,满足企业一键群发场景,支持多种语言SDK和API 接入。各个通信平台软件都集中在云端&#xff0c;且互通兼容&#xff0c;用户只要登录云通信平台&#xff0c;不…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...