代码随想录训练营第六天 | LeetCode 242. 有效字母异位词 LeetCode 349. 两个数组的交集 LeetCode 202. 快乐数 LeetCode 1. 两数之和

LeetCode 242. 有效异位词

题目链接:

LeetCode 242. 有效字母异位词

因为我在哈希表这块领域的知识是空白的,所以在做今天的题之前去查阅了一些哈希表,然后看了题解脑中才有了思路。

文章链接:

代码随想录

这道题利用题目中只有小写字母的条件,定义一个容量为26的数组,然后利用阿斯克码作为介质来进行操作,先看代码。

代码如下:

class Solution {
public:
    bool isAnagram(string s, string t) {
        int hash[26] = {0};
        for (int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
            hash[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
            if (hash[i] != 0) return false;
        }
        return true;
    }
};

看完代码相信思路已经出来了,就是第一个字符串有的字母就让hash数组的对应的元素加一,即为hash[s[i] - 'a']++。然后第二个字符串同理,只不过是减一,最后再看hash里有没有不为0的元素,如果有的话就不是异位词。没有就是异位词。

LeetCode 349. 两个数组的交集

题目链接:

LeetCode 349. 两个数组的交集

这题就要引入unordered_set了,这是一个C++的常用结构。要能够熟练运用它以及它包含的各种函数。

思路文章链接:

代码随想录

先定义一个unordered_set类型的容器,然后将第一个数组里的元素录入进去,然后通过find函数若没找到就返回set.end()的特点来判断另一个数组里有没有一样的元素,有的话就用insert函数插入另一个容器中,没有就继续遍历。最后返回vector<int>类型的数据。

代码实现如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;
        unordered_set<int> num_set(nums1.begin(), nums1.end());
        for (int num : nums2) {
            if (num_set.find(num) != num_set.end()) {
                result.insert(num);
            }
        }
        return vector<int>(result.begin(), result.end());
    }
};

其中还有一个范围循环,也就是for(定义一个数据类型 : 要遍历的容器),意思即为没进行一次循环num就等于容器中的下一位元素。

LeetCode 202. 快乐数

题目链接:

LeetCode 202. 快乐数

这道题其实和上一道题的思路差不多,不过可以巩固unordered_set的各种功能。

代码随想录文章链接:

代码随想录

只需要搞清楚快乐数的定义,然后知道如何处理,这道题就上道题一样了。

代码如下:

class Solution {
public:
    int getsum(int n) {
        int sum = 0;
        while (n) {
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }

    bool isHappy(int n) {
        unordered_set<int> set;
        while (1) {
            int sum = getsum(n);
            if (sum == 1) return true; 
            else if (set.find(sum) != set.end()) {
                return false;
            }
            else {
                set.insert(sum);
                n = sum;
            }
        }
    }
};

这道题就这样轻松的过了。

LeetCode 1. 两数之和

题目链接:

梦开始的地方LeetCode 1. 两数之和

又回到了梦开始的地方,三十年河东,三十年河西。现在已经可以做出来了哈哈。这道题需要用到unordered_map来进行操作,map与set就有了区别,可看文章。

文章链接:

代码随想录

其实本质上还是哈希表,把代码贴出来再看思路。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> map;
        for (int i = 0; i < nums.size(); i++) {
            auto n = map.find(target - nums[i]);
            if (n != map.end()) return {n->second, i};
            map.insert(pair<int, int>(nums[i],i));
        }
        return {};
    }
};

先定义一个unordered_map的map,auto是一个可以判断后面变量类型的关键词。然后,用map来存储(元素的值,元素下标)。最后就找map里有没有元素==target - nums[i],有的话就返回这两个数,没有就继续遍历。

今日学习5小时收获

今天新学习了哈希表,学习了unordered_map和unordered_set的几个用法,昨完今天的题之后感觉之前遇到的一些题好像并不是这么难了。所以哈希表真的会在一些方面很方便,后续的学习要继续加紧。最后多多重复,百炼成钢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值