2024.09.20 leetcode刷题记录

# 前言

        昨天发布了第一遍博客,感觉很好,趁着我现在还是很感兴趣就多发几遍,希望能坚持下去,在这里记录下自己学习成长的经历。

        今天是周五,下周一就又要去实习啦,距离上一段实习刚结束一个月,之前的是运维实习,这次找了开发的实习,目前是又期待又害怕(害怕啥都不会),总之还是去试试吧。最近在学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仓库。

        今天晚上还和舍友约了自助餐,吃完之后再去看一下实习期间要租的小屋,今天还是挺忙的,就到这里吧。

        最后再分享一句《我的团长我的团》里的一句话:死都不怕,就怕不安逸,命都不要,就要安逸,一起共勉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值