# 前言
昨天发布了第一遍博客,感觉很好,趁着我现在还是很感兴趣就多发几遍,希望能坚持下去,在这里记录下自己学习成长的经历。
今天是周五,下周一就又要去实习啦,距离上一段实习刚结束一个月,之前的是运维实习,这次找了开发的实习,目前是又期待又害怕(害怕啥都不会),总之还是去试试吧。最近在学go语言,今天不想往下学,那就刷刷题吧,打算先把面试150题刷完。
# 开始刷题
383.赎金信:
https://leetcode.cn/problems/ransom-note/description/?envType=study-plan-v2&envId=top-interview-150
思路很简单,就是先遍历一遍magazine,在哈希表中统计一下各个单词出现的次数,统计完后再去遍历一遍ransomNote,出现的字符再map中--就行了,若中--map[c] < 0 那就是无法构造出ransomNote,直接返回false就行。
我本来还在用if (map[c].count()>0) {map[c]++;} else {map[c] = 1;}这种写法,看了题解之后发现可以直接写成++map[c],代码瞬间清晰很多。
class Solution
{
public:bool canConstruct(string ransomNote, string magazine){if (ransomNote.size() > magazine.size()){return false;}unordered_map<char, int> map;for (char c : magazine){++map[c];}for (char c : ransomNote){if (--map[c] < 0){return false;}}return true;}
};
题解中还出了一种利用定长数组去代替哈希表的方法,感觉很好,比哈希表省空间。
class Solution
{
public:bool canConstruct(string ransomNote, string magazine){if (ransomNote.size() > magazine.size()){return false;}vector<int> v(26);for (auto &c : magazine){v[c - 'a']++;}for (auto &c : ransomNote){if (--v[c - 'a'] < 0){return false;}}return true;}
};
205、同构字符串
https://leetcode.cn/problems/isomorphic-strings/description/?envType=study-plan-v2&envId=top-interview-150
这道题是简单题,我一开始确实想简单了,我只用了一个哈希表,去判断s与t是不是一一对应,结果却始终通不过。
最后看了题解,才知道要完成双射,即s-t 和t-s ,为何呢?要不会出现下面这种情况
a b c b a
e e d e e a,b都对应上e的话,仅仅依靠单射,也是可以的,但题目明确说明了一个字符只能对应一个字符,所以要完成双射判断。
下面代码是我抄的leetcode官方题解:
class Solution
{
public:bool isIsomorphic(string s, string t){unordered_map<char, char> s2t;unordered_map<char, char> t2s;int len = s.length();for (int i = 0; i < len; ++i){char x = s[i], y = t[i];if ((s2t.count(x) &&s2t[x] != y) ||t2s.count(y) && t2s[y] != x){return false;}s2t[x] = y;t2s[y] = x;}return true;}
};
# 结尾
今天就先到这把,虽然两个有点少,还都是有关哈希表的简单题,因为我接下来想要研究一下github,创建一个自己的git仓库。
今天晚上还和舍友约了自助餐,吃完之后再去看一下实习期间要租的小屋,今天还是挺忙的,就到这里吧。
最后再分享一句《我的团长我的团》里的一句话:死都不怕,就怕不安逸,命都不要,就要安逸,一起共勉。