哈希表练习题

前言

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

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

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

第一题

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,祝大家开心

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目&#xff08;如电子档案信息管理&#xff09;中&#xff0c;查看电子图片信息是经常使用到的功能&#xff0c;此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

Java面试八股之Java中==和equals()的区别

Java中和equals()的区别 操作符&#xff1a; 对于基本数据类型&#xff08;如int、char、boolean等&#xff09;&#xff0c;比较的是它们的值是否相等。 对于对象引用类型&#xff0c;比较的是两个对象的内存地址&#xff08;即是否指向同一个对象实例&#xff09;。也就是…

Jetbrains Fleet这十个快捷键,效率提高50倍

当我们无法解决一段感情中的问题 就会选择解决这段感情 如果真诚不得到回应 那么再热情的人 也会沉默 很多人对你感兴趣 却没有人执着于你 我们知道任何一款牛批的IDE 都是有很多快捷键的,但是我们没有superpower ,不能记住所有的快捷键。 所以下面就总结了使用fleet 过…

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(七)

目录 1. 第一步 确定电磁环境 2. 第二步 确认设备工作状态 3. 第三步 制定试验计划 4. 间接施加的放电 4.1 水平耦合板 4.2 垂直耦合板 静电抗扰度的试验测试细节对测试结果影响比较大&#xff0c;本文详细介绍静电抗扰度试验的测试程序和注意事项。 1. 第一步 确定电磁…

PostgreSQL的学习心得和知识总结(一百三十九)|深入理解PostgreSQL数据库GUC参数 allow_alter_system 的使用和原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【学习】​CSMM和CMMI的关系你了解吗

CMMI和CSMM都是评估和提升软件组织能力成熟度的模型&#xff0c;但它们在起源、应用范围、模型结构和实施目的等方面存在一些区别。在当今竞争激烈的软件市场中&#xff0c;提升软件能力成为了多数组织追求成功的关键因素。而选择适合的体系标准能够助力企业发展得更加迅速。作…

企业实施定制鞋厂ERP软件需要注意哪些问题?

企业实施定制鞋厂ERP软件是个复杂的管理系统工程&#xff0c;为了成功地为企业定制实施ERP软件&#xff0c;需要注意和解决几个关键的问题&#xff1a; . 确立ERP系统实施和定制的决策者&#xff1b;. 做好前期咨询与调研工作&#xff1b;. 做好系统产品或项目迭代规划&#x…

【MySQL 数据宝典】【内存结构】- 003 Change Buffer 详解

一、 Change Buffer基本概念 Change Buffer&#xff1a;写缓冲区,是针对二级索引(辅助索引) 页的更新优化措施。 作用: 在进行DML操作时&#xff0c;如果请求的是 辅助索引&#xff08;非唯一键索引&#xff09;没有在缓冲池 中时&#xff0c;并不会立刻将磁盘页加载到缓冲池…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文&#xff0c;例如下面的 字体选择对话框&#xff0c;但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件

大家好&#xff0c;我叫秋意零。 最近对公司进行日常运维工作时&#xff0c;出现了一个 T1 级别事故。导致公司的“酒云网”APP的无法使用。我和我领导一起搞了一个多小时&#xff0c;业务也停了一个多小时。 起因是&#xff1a;我的部门直系领导&#xff0c;叫我**删除一个 …

LeetCode 2739. 总行驶距离

题目链接https://leetcode.cn/problems/total-distance-traveled/?envTypedaily-question&envId2024-04-25 简单题&#xff0c;看代码思考一下即可理解 class Solution {public int distanceTraveled(int mainTank, int additionalTank) {int res 0;while (mainTank >…

OmniPlan Pro for Mac v4.8.0中文激活版 项目流程管理工具

OmniPlan Pro for Mac是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。 OmniPlan Pro for Mac v4.8.0中文激活版 通过OmniPlan Pro&#xff0c;用户可以轻松创建任务&#xff0c;设置任务的开始和结束时…

苹果开发者 D-U-N-S 编号申请 经历 记录

首先查询需要注册的公司是否有D-U-N-S码 (如果之前该公司上架了苹果的app&#xff0c;那一定有的&#xff0c;直接查询就可以使用) 查询地址&#xff1a;Sign In - Apple 输入公司的相关信息后并没有找到。。 滑动到最下面之后&#xff0c;可以根据当前填写的内容进行提交申请…

iframe实现pdf预览,并使用pdf.js修改内嵌标题,解决乱码问题

项目中遇到文件预览功能,并且需要可以打印文件.下插件对于内网来说有点麻烦,正好iframe预览比较简单,且自带下载打印等功能按钮. 问题在于左上方的文件名乱码,网上找了一圈没有看到解决的,要么就是要收费要会员(ztmgs),要么直接说这东西改不了. 使用: 1.引入 PDF.js 库&…

Day51:动态规划 LeedCode 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

300. 最长递增子序列 中等 相关标签 相关企业 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] …

《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡

《动手学深度学习&#xff08;Pytorch版&#xff09;》Task02&#xff1a;预备知识——4.25打卡 数据操作N维数组——张量创建数组访问元素入门初始化矩阵 运算符广播机制索引和切片节省内存转换为其他Python对象转换为NumPy张量ndarray张量转换为Python标量 数据预处理安装pan…

00后卷王拿下20k的测试岗,原来面试这么简单。。。

先说一下我的情况&#xff0c;某211本计算机&#xff0c;之前在深圳那边做少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发现有点难&#xff0c;这边可能是业绩难做&#xff0c;虚假承诺很厉害&#xff0c;要给那些家长虚假承诺去骗人家&#xff0c;技术…

算法学习笔记Day8——回溯算法

本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;回溯算法代码是否有规律可循&#xff1f; 一、介绍 1.回溯算法是什么&#xff1f; 回溯算法就是个多叉树的遍历问题&#xff0c;关键在于在前序和后序时间点做一些操作…

操作steam搬砖有哪些风险?你有中招吗?揭秘有没有规避技巧?

一、关于steam账号的地区问题&#xff1a; steam账号地区不要频繁的去更换&#xff0c;这样很容易导致让账号红信不能操作使用。 二、关于steam账号的充值问题&#xff1a; 一定要充值正规的礼品卡图&#xff0c;否则遇到黑卡分分钟让你的账号红锁&#xff0c;从而造成账号里…

Nginx下载安装,什么是nginx,什么是反向代理,Windows下、linux下安装nginx(保姆级教程)

文章目录 一、Nginx简介为什么要使用NginxNginx的特点Nginx的相关概念正向代理反向代理动静分离负载均衡 二、Nginx安装1. Windows安装2. Linux安装 一、Nginx简介 Nginx 是一个高性能的 HTTP&#xff08;静态资源服务器&#xff09; 和 反向代理 Web 服务器。 为什么要使用N…