当前位置: 首页 > 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;不…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...