小白跟随卡哥刷题第七天(进入hash部分)

一、前言

进入了hash部分好像感觉难了很多,我想这可能跟我们的学习和刷题的方向有关,在学校里更多的是对理论部分的讲解(尤其是考研计算机的uu,对站、队列理论有比较多的练习),但是对于set、map等STL容器其实了解的并不多也基本上不会碰到(我是指没有刷题,只关注考研内容的uu)。如果有想系统了解STL容器的我也在这里放上一些我觉得还不错的一些b站视频供uu们学习 

同时也放上卡哥对于hash表基础知识的讲解链接(代码随想录)。

http://【C++进阶STL容器语法(栈、队列、堆、map、set)】https://www.bilibili.com/video/BV1644y1M7zv?vd_source=ddc0c3418868b72b2e688c97e6f7a3eaicon-default.png?t=N7T8http://【C++进阶STL容器语法(栈、队列、堆、map、set)】https://www.bilibili.com/video/BV1644y1M7zv?vd_source=ddc0c3418868b72b2e688c97e6f7a3eahttp://【【C++】算法竞赛常用 STL 用法】https://www.bilibili.com/video/BV1L8411y7th?vd_source=ddc0c3418868b72b2e688c97e6f7a3eaicon-default.png?t=N7T8http://【【C++】算法竞赛常用 STL 用法】https://www.bilibili.com/video/BV1L8411y7th?vd_source=ddc0c3418868b72b2e688c97e6f7a3ea

如果觉得以上视频帮助不大的uu,也可以自行去搜索ACM竞赛基本的讲解一部分就是关于STL容器的可以自己去学习,那么就进入今天的刷题吧(今天的题目我上机试的时候已经遇见了,不过那个时候只顾刷机试的相关类型的题目了,原来那个时候就已经遇见了hash表了,所以呀在面对任务时我会一心只顾任务而忘记了去关注任务相关的内容,这也是我现在想系统刷题的目的吧,把自己遗漏的、当初没有好好学的都趁着这段时间补上吧,顺嘴说一下如果有uu想了解计算机考研的也可以私信我,我也可以给各位25想考研的uu们一些个人建议,当然也是免费的,也算是我的一点小祝愿吧)。

二、题目(力扣第242题—有效的字母异位词. - 力扣(LeetCode)

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

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

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

三、题解

这个题目的意思就是统计两个词中所有的字母个数,若所含字母个数一样则判断为true否则为false,理解起来还是很简单的(我们当时的上机题目有一道与此非常类似,我也大概说一下题目,就是统计一句英文中出现频率最高的字母,返回字母出现的次数和该字母。与此题几乎一模一样的思路可以说,接下来就讲讲吧)。照例我把卡哥的讲解放在了这里,我和卡哥的思路基本是一样的,不过卡哥的代码更加简洁、明了,这也是我还不具备的能力,还需要再练。(卡哥的讲解:代码随想录)。

思路还是很简单的,使用hash表(hash表的作用就是来判断一个元素是否已经出现在hash表里,通常可以使用数组、vector、set、map都是可以充当hash表的)。因此此题的目的就是检验两个string所含字母是否相同,那么就可以使用最坚定的hash表形式,数组即可。将一个string里的字母逐个存入数组中,同时因为字母种类是有限的且ASC||码是连续的,所以是可以使用数组的,否则 只能使用set或者map,这两种后面会练习到。

 bool isAnagram(string s, string t) {
	vector<int> vecs(26,0);//设置两个数组,长度为26赋初值为0
	vector<int> vect(26,0);
	int ls=s.size();//得到两个字符串长度
	int lt=t.size();
	if(ls!=lt)return false;//若字符串长度都不一样,则返回false即可
	else{
	for(int i=0;i<ls;i++){//将第一个字符串中的字母及次数存入vecs中,比如vecs【0】代表a,其值代表a出现的次数
		vecs[s[i]-'a']++;
	} 
	for(int i=0;i<lt;i++){//同理将第二个字符串的字母及次数存入vect
		vect[t[i]-'a']++;
	} 
	for(int i=0;i<26;i++){//比较每个字母是否出现以及出现的次数
		if(vecs[i]!=vect[i]){
			return false;
			break;
		}
	}
	return true;
    }
}

该算法中最重要的就是使用数组vec[s[i]-'a']来代表每个字母然后vec[s[i]-'a']的值来代表其出现的次数,若为0则说明未出现。其中最重要的就是字母是有限的(26个)且其ASC||是连续的,我就用字母减去‘a’即可,比如‘a’-‘a’就等于0,vec[‘a’-‘a’]=vec[0]就代表a,其值就代表a出现的次数,以此类推其他字母即可。

四、后记

进入了hash表,也就算是进入了第一个我认为比较难的数据结构了,这个部分需要好好跟着卡哥学习、练习,去熟悉set、map等以前不常用的数据结构。各位uu们加油加油,坚持住,我们都会有自己的收获,我们都有光明的未来!!!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Spring Boot中封装的RedisTemplate来操作Redis中的hash类型的数据。例如: - 存储hash类型的值: ``` redisTemplate.opsForHash().put(key, hashKey, value); ``` - 获取hash类型的值: ``` redisTemplate.opsForHash().get(key, hashKey); ``` - 删除hash类型的值: ``` redisTemplate.opsForHash().delete(key, hashKey); ``` 请注意,在使用RedisTemplate前,需要配置redis连接(如果使用Spring Boot,会自动配置)。 ### 回答2: Spring Boot使用RedisTemplate存放hash类型的值进入Redis可以通过以下步骤实现: 1. 在Spring Boot的配置文件中配置Redis的连接信息,包括主机地址、端口号、密码等。 2. 在Spring Boot的配置类中配置RedisTemplate的Bean,用于操作Redis数据库。 3. 创建一个Hash类型的数据结构,并使用RedisTemplate将其存入Redis中。 ```java // 获取RedisTemplate Bean @Autowired private RedisTemplate<String, Object> redisTemplate; public void storeHashToRedis(String key, Map<String, Object> hash) { HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); hashOperations.putAll(key, hash); } ``` 在上述示例代码中,首先通过RedisTemplate的opsForHash()方法获取Hash类型的操作对象,然后使用putAll()方法将整个Map作为一个键值对存入Redis中。key表示保存到Redis中的键,hash表示需要存储的Hash类型值。 4. 使用RedisTemplate从Redis中获取已存储的Hash类型值。 ```java public Map<String, Object> getHashFromRedis(String key) { HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); return hashOperations.entries(key); } ``` 上述代码中,通过opsForHash()方法获取Hash类型的操作对象,使用entries()方法获取指定键的整个Hash类型值,返回一个Map对象。 通过使用RedisTemplate存放Hash类型的值进入Redis,可以方便地对Hash类型的数据进行操作,如添加、修改、删除、查询等。同时,RedisTemplate提供了丰富的操作方法,使得在Spring Boot中使用Redis更加便捷。 ### 回答3: 使用Spring Boot的RedisTemplate来存放Hash类型的值到Redis非常简单。首先,需要在Spring Boot项目的配置文件中配置Redis相关的信息,包括Redis的地址、端口号、密码等。配置完成后,在需要使用Redis的地方注入RedisTemplate。 在存放Hash类型的值之前,需要使用RedisTemplate的opsForHash()方法获取操作HashHashOperations对象。通过HashOperations对象的put()方法,可以将Hash类型的值存放到Redis中。put()方法接受三个参数,第一个参数是Redis的key,第二个参数是Hash的域(field),第三个参数是Hash的值(value)。 以下是一个示例代码: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveDataToRedis() { HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash(); hashOperations.put("myHashKey", "field1", "value1"); hashOperations.put("myHashKey", "field2", "value2"); } ``` 以上代码中,我们首先通过注入RedisTemplate来获取Redis的HashOperations对象。然后,我们使用HashOperations对象的put()方法将两个键值对存放到名为"myHashKey"的Hash中,其中"field1"对应的值是"value1","field2"对应的值是"value2"。 需要注意的是,在存放Hash类型的值进入Redis时,如果Redis的key已经存在,那么新的域-值对将会被添加到已经存在的Hash中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值