代码随想录(day6)——哈希表

news2025/1/12 1:52:19

Leetcode.242 有效的字母异位词:

242. 有效的字母异位词 - 力扣(LeetCode)

       原理简单,首先判断给定的两个字符串的长度是否相等,如果不相等则直接返回false,只有在给定字符串长度想的的情况下才进行下一步的判断。

      当给定的元素相等时,首先创建名为hashhash1的两个数组,数组大小为26,并且对st字符串进行遍历,在遍历的过程中,使hash[s[i]-'a']位置的数值++,hash[t[i]-'a']位置的数值++。

      遍历hash,hash1两个数组,如果出现了hash[i] \, \, != \, \, hash1[i]的情况,则直接返回false。遍历结束后返回true。对于代码如下:

class Solution {
public:
    bool isAnagram(string s, string t) {

        int hash[26] = {0};
        int hash1[26] = {0};

        if( s.size() != t.size())
        {
            return false;
        }

        for(size_t i = 0; i < s.size(); i++)
        {
            hash[s[i]-'a']++;
            hash1[t[i]-'a']++;
        }

        for(int j  = 0; j < 26; j++)
        {
            if(hash[j] != hash1[j])
            {
                return false;
            }
        }

        return true;

    }
};

运行结果如下:

(注:在下面给出的题目解析中,会涉及到map,set的使用,由于作者本人水平有限,并不能给出关于这两种数据结构的相关解释,因此只给出使用方法,对于这两种数据结构进行解析的文章,将在20244月之前给出。)

Leetcode.349 两个数组的交集:

349. 两个数组的交集 - 力扣(LeetCode)

       本题虽然使用set会更加方便,但是并不是刚性要求,因此介于作者水平有限,将使用vector进行解答:

      首先创建一个大小大于1000的数组hash,遍历数组nums1,使得hash[nums1[i]]=1。在遍历完成后,遍历另一个数组nums2,如果hash[nums2[i]] ==1,则说明该该数值在nums1种出现过,需要进行记录。

      对于如何记录,可以创建一个vector<int>类型的对象result,如果出现了满足上面给出的条件的数据,则通过push_back函数进行插入。并且,为了满足交集的性质,即:集合中不能出现重复的元素。需要进行去重。

      去重的方法如下:在进行了push_back操作后,则令hash[nums2[i]]=0。后续再遇到相同的元素时,便不会向result种进行尾插,达到了去重的目的。对于代码如下:
 

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

     int hash[1001] = {0};

     for(int i = 0; i < nums1.size(); i++)
     {
        hash[nums1[i]] = 1;
     }

     vector<int> result;
    
     for(int j = 0; j < nums2.size(); j++)
     {
        if(hash[nums2[j]] == 1)
        {
            result.push_back(nums2[j]);
          
            hash[nums2[j]] = 0;
        }
     }

     return result;

    }
};

运行结果如下:

Leetcode.202 快乐数:

202. 快乐数 - 力扣(LeetCode)

       对于本题,难点在于理解题干中的信息。对于快乐数的定义,题目中已经给了19的样例,因此不再进行过多解释。但是在题干中,提到了在求快乐数的过程中,将这个数替换为每个位置上的数字的平方和的过程是无限循环的,例如文章给定一个数2,则求解2是否为快乐数的过程可以由下图表示:

而对于题目中给的样例19,求解其是否是快乐数的过程如下:

不难发现,当一个数经过若干次计算,得到的结果为1时,则后续的结果便是无限循环1,因此,也可以把1这个过程看作上面菲快乐数的成环过程,即:

       不过上面给出的例子只是两个个例,并不具备普遍性,由此会引起一个问题:对于一个数I,I可以是任意一个正整数,均存在上面的环状循环过程吗?对于这一过程,下面将使用鸽巢原理进行证明:

      对于鸽巢原理,其大体内容为:存在n个巢,n+1个鸽子,则必定存在一个巢,里面的鸽子数量>1,假设取一个数为9999999999,即10个数位上都是9。如果对这个最大的数值进行一次上面的操作,则不难得出,这个数是一定小于810的,因此,对于这个数据在求解快乐数时产生的数据的范围一定是[1,810],假设,每进行一次上方的运算,都会得到一个属于上面区间中的不同的数值,那么,在进行811次操作后,一定会得到一个和之前某次运算得到的值相同的值。因此,如果运算次数够多,对于任何一个数,均存在一个无限循环。

     在证明了一定会出现环状循环后,便可以进行解题:

       首先创建一个函数用于进行一次上面计算欢乐数的过程,这里将这个函数命名为multvalue,并且创建一个变量用于接收函数的返回值,这里将这个变量命名为value。通过set创建一个哈希表,这里命名为hash

      每进行一次计算,便进行一次判断,如果value==1,则说明是快乐数,返回true,如果不是,则首先查找这个数是否在hash中出现过,如果出现过,则说明进入了上图中非快乐数的死循环,返回false,反之则将这个数存放在hash中。具体代码如下:

class Solution {
public:
    
    int multvalue(int n)
    {
        int sum = 0;
        int t = 0;
        while(n)
        {
            t = n%10;//取n的最小位上的数
            sum += t*t;//
            n = n/10;//去掉最小位

        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> hash;

        int value = n;
        while(1)
        {
            value = multvalue(value);

            if(value == 1)
            {
                return true;
            }

            if( hash.find(value) != hash.end())
            {
                return false;
            }
            else
            {
                hash.insert(value);
            }
        }

    }
};

运行结果如下:

    

Leetcode.1 两数之和—梦开始的地方:

1. 两数之和 - 力扣(LeetCode)

        对于本题,依然可以使用哈希的思想进行解题,具体如下:
        首先利用map创建一个哈希表,具体结构为:第一个位置存放数值,第二个位置存放该数值所对应的下标。同时创建一个vector<int>类型的对象v用于存储返回值首先对给定的nums进行遍历,每当遍历一个数值时,在哈希表中对target-nums[i]这个数值进行查询。此时会出现两种情况:

        如果存在这个数,则表示找到了这个数,同时将这个数所对应的数值以及下标插入到v中,返回v

      如果不存在target-nums[i],则将nums[i],i这两个数值插入到哈希表中。循环上述过程。

下面将通过一组例子,来对上述过程进行图像化的说明:

     例如,给定上图所示的数字,且需要查找的目标和为target,在进行循环时,首先对数组的第一个元素2进行判断,即:去哈希表中,找是否存在target-nums[0] = 7这个数,此时不存在,则向哈希表中插入nums[0],0,即:

       对元素5进行判断,查找哈希表中是否存在target-nums[1] = 4这个数值,由于不存在,因此,向哈希表中插入nums[1],1,即:

       对元素7进行判断,查找哈希表中是否存在target-nums[2]=2这个数值,此时存在,则向v中插入这两个数的下标,即0,2。返回v。对应代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
         std::unordered_map <int,int> hash;
         vector<int> v;

         for(size_t i = 0; i < nums.size(); i++)
         {
            auto iter = hash.find(target-nums[i]);
            if(iter != hash.end())
            {
                v.push_back(i);
                v.push_back(iter->second);
                return v;
            }

            hash.insert(pair<int, int>(nums[i], i));
         }
         return v;
        
    }
};

运行结果如下:

    

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

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

相关文章

(三)OpenOFDM符号对齐

符号对齐 模块&#xff1a;sync_long.v输入&#xff1a;I (16), Q (16), phase_offset (32), short_gi (1)输出&#xff1a;long_preamble_detected (1), fft_re (16), fft_im (16) 检测到数据包后&#xff0c;下一步是精确确定每个 OFDM 符号的起始位置。在802.11中&#xf…

4-如何进行细分市场分析-03 竞争者分析

任何一个行业肯定都是有很多竞争者&#xff0c;我们如何判断这些竞争者对我们有什么样的威胁、什么样的机会、什么样的影响&#xff0c;我们需要去分析这些竞争者。 行业竞争格局如何分析&#xff1f; 我们可以从一些基本指标来入手&#xff0c;如市场集中度、行业利润率。 竞…

(学习日记)2024.03.15:UCOSIII第十七节:任务的挂起和恢复

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

ChatGPT提示词方法的原理

关于提示词&#xff0c;我之前的一些文章可以参考&#xff1a; 【AIGC】AI作图最全提示词prompt集合&#xff08;收藏级&#xff09;https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

SAR ADC教程系列5——FFT频谱泄露以及相干采样

频谱泄露的出现以及如何规避&#xff1f; 为什么要相干采样&#xff1f; 1.分析ADC输出信号的频谱工具&#xff1a;DFT&#xff08;Discrete Fourier Transform) 重点&#xff1a;DFT相邻频谱频率间隔为fs/N 如何规避频谱泄露&#xff1f; 对于DFT&#xff0c;它对于接收到的信…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛——A 题:生产线的故障自动识别与人员配置具体思路以及源代码分析

一、问题背景 随着新兴信息技术的大规模应用&#xff0c;工业生产线的智能化控制技术日益成熟。自动生产线 可以自动完成物品传送、物料填装、产品包装和质量检测等过程&#xff0c;极大地提高了生产效率和 产品质量&#xff0c;减少了生产成本。自动生产线融入故障智能报警…

学习笔记--强化学习(1)

参考&#xff1a;https://blog.csdn.net/koulongxin123/article/details/122676149 1.什么是强化学习&#xff1f; (1)定义 基于环境的反馈而行动&#xff0c;通过不断与环境的交互、试错&#xff0c;最终完成特定目的或者使得整体行动收益最大化&#xff08;是一种通过与环境…

echarts实践总结(常用一):柱状图(特点:渐变色、点击缩放、左右滑动、悬浮展示样式)

目录 第一章 echarts基本使用 第二章 echarts实践——柱状图 效果展示 第一章 echarts基本使用 Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客 第二章 echarts实践——柱状图 最近接到这么一个需求&#xff0c;需要画页面&#xff0c;然后有这么几个echarts的图需…

asp.net 作业星软件系统

asp.net 作业星软件系统 用户功能:分教师和家长&#xff08;学生) 注册登录:登录部分是用户名密码&#xff0c;以及教师和家长&#xff08;学生&#xff09;的勾选; 注册包括用户名密码确认密码再次确认密码(与上方输入的密码比对&#xff09;身份班级设置找回账号的问题和答案…

【计算机网络】什么是http?

​ 目录 前言 1. 什么是HTTP协议&#xff1f; 2. 为什么使用HTTP协议&#xff1f; 3. HTTP协议通信过程 4. 什么是url&#xff1f; 5. HTTP报文 5.1 请求报文 5.2 响应报文 6. HTTP请求方式 7. HTTP头部字段 8. HTTP状态码 9. 连接管理 长连接与短连接 管线化连接…

养鸡厂用这个开源监控方案,应该很棒

软件介绍 WVP-PRO是基于GB/T 28181-2016标准的流媒体平台&#xff0c;依托于优秀的开源流媒体服务 ZLMediaKit 提供全面且丰富的功能。该软件允许用户将 IPC 摄像头接入平台&#xff0c;支持28181、rtsp、rtmp、flv等协议&#xff0c;可实现视频流发送到其他平台&#xff0c;广…

记日志打印引起接口慢问题排查

其他系统调用本接口&#xff0c;其他系统反馈接口慢&#xff0c;查看接口用时0.07s&#xff0c;但仔细观察日志发现接口确实慢了用时5.978s&#xff1b; 日志写入NAS盘&#xff0c;非本地写入肯定会有一定的延时&#xff0c;看日志打印策略是同步滚动打印&#xff0c;改成异步打…

软件实例,餐厅酒水寄存管理系统软件,酒水寄存登记表软件操作教程

软件实例&#xff0c;餐厅酒水寄存管理系统软件&#xff0c;酒水寄存登记表软件操作教程 一、前言 以下软件操作以 佳易王酒水寄存管理系统软件V16.0为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、酒水寄存管理系统软件可以管理多个品类的物…

[NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数 题目描述 设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 输入格式 第一行有一个整数&#xff0c;表示数字个数 n n n。 第二行有 n n …

小白DB补全计划Day1-LeetCode:SQL基本操作select

前言&#xff1a;找工作&#xff08;主人&#xff09;的任务罢了 链接&#xff1a;1757. 可回收且低脂的产品 - 力扣&#xff08;LeetCode&#xff09; 584. 寻找用户推荐人 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 对DB篇的SQL章不太知道怎么写…

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符

8.Python从入门到精通—Python 字符串,转义字符,字符串运算符 Python 字符串创建字符串访问字符串中的字符字符串切片字符串操作符字符串方法 Python 转义字符Python字符串运算符 Python 字符串 在 Python 中&#xff0c;字符串是一种基本数据类型&#xff0c;用于表示文本数据…

深度学习pytorch——Tensor维度变换(持续更新)

view()打平函数 需要注意的是打平之后的tensor是需要有物理意义的&#xff0c;根据需要进行打平&#xff0c;并且打平后总体的大小是不发生改变的。 并且一定要谨记打平会导致维度的丢失&#xff0c;造成数据污染&#xff0c;如果想要恢复到原来的数据形式&#xff0c;是需要…

【全面了解自然语言处理三大特征提取器】RNN(LSTM)、transformer(注意力机制)、CNN

目录 一 、RNN1.RNN单个cell的结构2.RNN工作原理3.RNN优缺点 二、LSTM1.LSTM单个cell的结构2. LSTM工作原理 三、transformer1 Encoder&#xff08;1&#xff09;position encoding&#xff08;2&#xff09;multi-head-attention&#xff08;3&#xff09;add&norm 残差链…

A Workload‑Adaptive Streaming Partitioner for Distributed Graph Stores(2021)

用于分布式图存储的工作负载自适应流分区器 对象&#xff1a;动态流式大图 划分方式&#xff1a;混合割 方法&#xff1a;增量重划分 考虑了图查询算法&#xff0c;基于动态工作负载 考虑了双动态&#xff1a;工作负载动态&#xff1b;图拓扑结构动态 缺点&#xff1a;分配新顶…

C语言基础之输入输出

前言 本次博客会是最有料的博客了,这其中的问题尤其是scanf函数对新手很不友好 我们本次 1会讲解其他的一些输入输出函数,分析他们的优劣点 2本次的参考资料来自于 c primer plus 1scanf函数详解 首先大家了解过scanf的功能吗 1大家已经学到这里了,肯定知道,scanf是从输…