哈希表练习题

news2024/11/26 20:29:17

前言

本次博客将要写一写,哈希表的一些使用

哈希表主要是一个映射,比如数组就是一个哈希表

是一个整型对应另一个整型,介绍的哈希表还是要以写题目为例

第一题

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

直接来看这个题目吧

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词

提示:

  • 1 <= s.length, t.length <= 5 * 10的4次方
  • s 和 t 仅包含小写字母

思路

暴力思路

我们可以使用两个for循环一个一个判断,从第一个字符到最后一个字符与第二个字符串每一个元素比对,其次还要进行去重操作,因为在比对过程中可能会出现重复的字符

比如 aabcd abcdf这两个字符串如果一一比对第二个字符会被配对两次,而按照代码逻辑

会把他两当成配对成功,所以还需要一个状态数组,来进行去重,暴力思路也有细节的

看代码吧!

#include<iostream>
#include<string.h>
using namespace std;
int state[50010] = {0};
int main()
{
	//定义两个字符串
	char a[] = "bacdeffffassadawd";
	char b[] = "ssadawdbacdeffffa";
	int sizea = strlen(a);
	int sizeb = strlen(b);
	int flag = 0;
	//如果大小不等,直接排除
	if (sizea != sizeb)
	{
		printf("不是\n");
		return 0;
	}  
	for (int i = 0; i < sizea; i++)
	{
		for (int j = 0; j < sizeb; j++)
		{
			flag = 0;
			if (a[i] == b[j]&&!state[j])
			{
				state[j] = 1;
				flag = 1;
				break;
			}
		}
		if (flag == 0) { printf("不是\n");break;}
	}
	if (flag == 1)
		printf("找到了\n");

	return 0;
}

再看看测试结果

改个数据

ok暴力可以解决问题

不够代价可不小

首先额外开了一个int类型大小为5万的数组,其次时间复杂度为o(n^2)

不太好的一个代码,但是思路是无罪的

哈希表思路

思路

题目中,只有26个字母唉而且只有小写字母

我们可以用0~25分别映射a~z这个字母,完全可以采用数组这个结构

第一个字符串中 字母出现一次,让对应的下标的数组的值加一

第二个字符串  字母出现一次,让对应的下标的数组的值减一

最后遍历一遍数组

如果有不等于0的值就判断为不是

如果全部通过,就判断为是

看代码吧

int main()
{
	//这里随便写的一个
	char a[] = "abcdefghijilmndjalwjdjakd";
	char b[] = "lmndjalwjdjakdabcdefghiji";
	//初始化为0(非完全初始化默认的元素就是为0)
	int arr[26] = {0};
	int asize = strlen(a);
	int bsize = strlen(b);
	//如果长度不一,一定不是
	if (asize != bsize)
	{
		printf("不是\n");
		return 0;
	}
	for (int i = 0; i < asize; i++)
	{
		arr[a[i] - 'a']++;
		arr[b[i] - 'a']--;
	}
	for (int i = 0; i < 26; i++)
	{
		if (arr[i] != 0)
		{
			printf("不是\n");
			return 0;
		}
	}
	printf("是\n");
	return 0;
}

OK,最终结果也不太想,演示了,没问题的

看下一题

第二题

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

给定两个数组 nums1 和 nums2 ,返回 它们的 

交集

输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

暴力思路

其实就是,通过两个for循环,依次遍历即可,相等的记录在另一个数组中

额,有点不想敲了 哈哈哈,来吧

注意 两个数组的大小都在1000以内,所以 结果数组大小 在1010就行

他们的值是在0~1000 其实short类型就够了,当然这里仍然需要我们自己去去重

毕竟他们的值实在0~1000,我们可以再来一个1000大小的数组来判断这个值出现了没有

如果他们的值很大很大暴力法是不可行的,好吧这里的状态数组本身就是一个哈希表

它的含义是state[i]   i为0~1000的范围 如果该值已经出现state[i]==1

没有出现就默认为0 这样大家就懂了吧

看代码喽

short result[1010];
short state[1000];
int main()
{
	short a[] = { 1,2,3,4,5,6,7,8,9,10};
	short b[] = { 2,2,3,4,5,5,6,6,6,6,6};
	size_t sizea = sizeof(a) / sizeof(a[0]);
	size_t sizeb = sizeof(b) / sizeof(b[0]);
	size_t sizer = 0;
	for (int i = 0; i < sizea; i++)
	{
		for (int j = 0; j < sizeb; j++)
		{
			if (a[i] == b[j]&&!state[a[i]])
			{
				result[sizer++] = a[i];
				state[a[i]] = 1;
				break;
			}
		}
	}
	for (int i = 0; i < sizer; i++)
	{
		printf("%d ", result[i]);
	}
	return 0;
}

看结果

没有错,但是这个代码o(n)的空间

o(n^2)的时间实在不好,那么看优化的吧

这里用set

不过这里的set容器是c++代码

也好理解

最普通的set可以自动去重,而且会自动排序

不要觉得功能多,实际上时间复杂度也高

这里就简单介绍set就好,这里是STL库里的内容

思路就是,把数组中元素放到第一个set容器里面

然后,再构建一个set,如果可以在第一个set里找到与第二个数组相同的元素,就纪录在第二

个set中

ok,看代码

int main()
{
	set<int>st1;
	set<int>st2;
	short a[] = { 1,2,3,4,5,6,7,8,9,10};
	short b[] = { 2,2,3,4,5,5,6,6,6,6,6};
	size_t sizea = sizeof(a) / sizeof(a[0]);
	size_t sizeb = sizeof(b) / sizeof(b[0]);
	for (int i = 0; i < sizea; i++)
	{
		st1.insert(a[i]);
	}
	for (int i = 0; i < sizeb; i++)
	{
        //这里是一个迭代器
		if (st1.find(b[i]) != st1.end())
		{
			st2.insert(b[i]);
		}
	}
	//遍历一遍
	for (auto& ele : st2)
	{
		cout << ele<<" ";
	}
	return 0;
}

第三题

202. 快乐数 - 力扣(LeetCode)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

示例 2:

输入:n = 2
输出:false

 提示:

  • 1 <= n <= 2^31-1

思路

首先看到这个题目先得分析数据

n的大小为2的31次方-1就是一个int类型的最大值

但是在计算过程中会不会越界呢?这个大小为20亿左右

是一个十位数那么假设每一位都是9

9^2*10也才810所以int类型可以

其次再看题意

他是要出现一个1才为快乐数呀,这个很好判断对吧

那么怎么判断它不是快乐数,也就是它一直循环

既然是循环,那么肯定是一个圈就是在运算的过程中,会转一圈从而出现之前出现过的数

对吧这个时候,哈希表的判断是否存在于一个集合中就起作用了

set

它的增删查改时间复杂度为logn

如果使用暴力的话,它的时间复杂为n,算了这里不写暴力了

看代码吧

应该也挺好懂的

bool isHappy(int n) {
    set<int>st;
    int sum = 0;
    int c = n;
    st.insert(n);
    while (1)
    {
        sum = 0;
        while (c)
        {
            sum += pow(c % 10, 2);
            c /= 10;
        }
        c = sum;
        if (c == 1)
            return true;
        for (auto& ele : st)
        {
            if (ele == c)
                return false;
        }
        st.insert(c);
    }
}
    int main()
    {
        if (isHappy(50))
            printf("yes");
        else
            printf("no");
        return 0;
    }
   

总结

今天就写这三题,OK,祝大家开心

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

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

相关文章

vue-manage-system 更新,后台管理系统开发更简单

vue-manage-system 近期进行了一次版本升级&#xff0c;主要是支持了更多功能、升级依赖版本和优化样式&#xff0c;并且上线了官方文档网站&#xff0c;大部分功能都有文档或者使用示例&#xff0c;更加适合新手上手开发&#xff0c;只需要根据实际业务简单修改&#xff0c;就…

【讯为Linux驱动笔记1】申请一个字符设备

Linux下每个设备都需要有一个专属设备号&#xff1a;主设备号 次设备号 【申请字符设备】 主设备号&#xff1a;一类驱动&#xff1a;如&#xff1a;USB驱动 次设备号&#xff1a;这类驱动下的某个设备 如&#xff1a;键盘鼠标 设备号是32位的dev_t类型的&#xff0c;高12位主…

STL_deque_stack_queue

Deque deque容器(双端队列) ​deque是一种双向开口的分段连续线性空间&#xff08;对外号称连续&#xff0c;使用者无法感知它是分段的&#xff09;。deque支持从头尾两端进行元素的插入和删除。deque没有容量的概念&#xff0c;因为它是动态地以分段连续空间组合而成的。随时…

同态加密原理解析

目录 1.数学介绍2.使用多项式环进行加密2.1 私钥和公钥的产生2.2 加密2.3 解密 3.同态计算3.1 同态加法3.2 同态乘法 1.数学介绍 同态加密方案基于一个难以计算的问题Ring Learning with Errorsred。这些方案中的数据在加密和未加密时都用多项式表示。 这里举一个简单的多项式…

最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版 土堆教程

最详细的 Windows 下 PyTorch 入门深度学习环境安装与配置 CPU GPU 版 | 土堆教程 Windows 下 PyTorch 入门深度学习环境安装与配置 GPU 版 教程大纲如何使用此教程快速开始版本 Windows下判断有无NVIDIA GPU安装Anaconda作用流程下载安装 Anaconda 创建虚拟环境利用conda或者…

jmeter安装和简单使用

jmeter安装和简单使用 1. 安装 jmeter是基于Java开发的测试应用&#xff0c;其运行依赖于java环境&#xff0c;所以在下载运行jmeter前&#xff0c;先确保本机已经安装jdk或者jre&#xff0c;安装jdk步骤此处不描述。 下载jmeter&#xff1a; jmeter是Apache旗下的产品&…

电阻理论基础

电流的形成是电荷运动&#xff0c;电子方向相反&#xff0c;标量 电压&#xff1a;电势有参考点&#xff0c;是一个相对量 电阻的值不取决于电压和电流的&#xff0c; Ra表示标准电阻 R表示任意温度的电阻

数据结构:时间复杂度和空间复杂度

目录 1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 推导大O阶方法3.4 常见时间复杂度计算举例 3.空间复杂度 1. 如何衡量一个算法的好坏 下面求斐波那契数列的算法好还是不好&#xff0c;为什么&#xff1f;该如何衡量一个算…

新书推荐机器学习大数据平台的构建、任务实现与数据治理

在大数据与机器学习日新月异的今天&#xff0c;构建稳定、安全、可扩展的数据平台已成为企业和研究机构的迫切需求。这本书应运而生&#xff0c;提供了详尽且实用的指南&#xff0c;帮助读者在云计算环境中构建、优化和治理大数据平台。 作者以清晰明了的写作风格&#xff0c;…

实现基于UDS LIN诊断协议的本地OTA升级

一、目标 在上篇文章LIN诊断实现MCU本地OTA升级_lin ota-CSDN博客中已经基于LIN诊断协议实现了通过PC端上位机对MCU进行本地的OTA升级&#xff0c;但是没有完全按照UDS协议实现。本篇将在上篇文章的基础上进行改进&#xff0c;实现基于UDS LIN诊断协议的本地OTA升级。本篇文章对…

C语言 | Leetcode C语言题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;UT_hash_handle hh; };struct hashTable* find(struct hashTable** hashtable, int ikey) {struct hashTable* tmp NULL;HASH_FIND_INT(*hashtable, &ikey, tmp);return tmp; }void insert(struct hashTabl…

nvm 使用教程

在任意目录中的空白处 按住Shift键不放&#xff0c;鼠标点击右键&#xff0c;在弹出的菜单中选择 “在此处打开 Powershell 窗口(S)”。 查看远程线上的nodejs版本 nvm ls available 查看自己安装的nodejs版本 nvm ls 切换nodejs版本号 nvm use 版本号 安装 xxx版本的nodej…

浅谈游戏机制

浅谈游戏机制 前言什么是游戏机制&#xff1f;机制组成机制类别结语 前言 最近在编写游戏开发文档的时候了解到游戏机制&#xff0c;第一次接触游戏机制的概念难免有些陌生&#xff0c;但感觉又跟常见&#xff0c;在网上查阅浏览了一些资料后了解到游戏机制还不止一个。 现在将…

Linux|Awk 变量、数字表达式和赋值运算符

引言 本部分[1]将深入学习 Awk 的高级应用&#xff0c;以应对更为复杂的文本或字符串过滤任务。将介绍包括变量、数值表达式和赋值运算符在内的 Awk 功能。 这些概念与你之前可能在诸如shell、C、Python等许多编程语言中接触过的概念并没有本质上的不同&#xff0c;所以你不必过…

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文&#xff1a;Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

Python:解析pyserial串口通讯

简介&#xff1a;串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口 &#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#…

全额退款20000,what?

接单的时候有多兴奋&#xff0c;退单的时候就有多落寞。今天我对客户全额退款了&#xff0c;跟踪了10天的项目正式结束。 这是我接单以来项目单价最高的一个项目&#xff0c;本来不太想接的&#xff0c;因为业务领域不擅长&#xff0c;又想挑战一下。兜兜转转找了几个人因为各种…

Python请求示例电商商品详情数据(API接口开发系列),从入门到实战

在电商系统中&#xff0c;商品详情数据通常通过API接口提供。以下是一个从入门到实战的Python请求示例&#xff0c;展示如何获取电商商品详情数据。 入门篇&#xff1a;理解API接口 首先&#xff0c;你需要了解API&#xff08;应用程序接口&#xff09;的基本概念。API允许不…

用Redis实现获取验证码,外加安全策略

安全策略 一小时内只能获取三次&#xff0c;一天内只能获取五次 Redis存储结构 代码展示 import cn.hutool.core.util.RandomUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; import org.spri…

JVM学习笔记(五)内存模型

目录 1、原子性 1.1 问题分析 1.2 解决方法 2、可见性 2.1 退不出的循环 2.2 解决办法 3、有序性 3.1 诡异的结果 3.2 解决办法 3.3 有序性理解 3.4 happens-before 4、CAS与原子类 4.1 CAS 4.2 乐观锁与悲观锁 4.3 原子操作类 5、synchronized 优化 5.1 轻量…