# 前言
昨天发布了第一遍博客,感觉很好,趁着我现在还是很感兴趣就多发几遍,希望能坚持下去,在这里记录下自己学习成长的经历。
今天是周五,下周一就又要去实习啦,距离上一段实习刚结束一个月,之前的是运维实习,这次找了开发的实习,目前是又期待又害怕(害怕啥都不会),总之还是去试试吧。最近在学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、同构字符串
这道题是简单题,我一开始确实想简单了,我只用了一个哈希表,去判断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仓库。
今天晚上还和舍友约了自助餐,吃完之后再去看一下实习期间要租的小屋,今天还是挺忙的,就到这里吧。
最后再分享一句《我的团长我的团》里的一句话:死都不怕,就怕不安逸,命都不要,就要安逸,一起共勉。