代码随想录算法训练营day06|LeetCode 242,LeetCode 349,LeetCode 202,LeetCode 1

前言

这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招
个人背景
211CS本+CUHK计算机相关硕,一年车企软件开发经验
代码能力:有待提高
常用语言:C++

系列文章目录

第一天 数组 part01

第二天 数组 part02

第三天 链表 part01

第四天 链表 part02

第五天 休息

第六天 哈希表 part01


`



一、今日任务

● 哈希表理论基础
● 242.有效的字母异位词
● 349. 两个数组的交集
● 202. 快乐数
● 1. 两数之和

二、详细布置

哈希表基础知识

哈希表基础

242.有效的字母异位词

题目链接:力扣242
文章讲解:代码随想录-有效的字母异位词
视频讲解:代码随想录

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

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

样例1:
输入: s = "anagram", t = "nagaram"
输出: true   
样例2:
输入: s = "rat", t = "car"
输出: false    
思路

这题一眼看就是字母数组,统计每个字符串中各个字母的个数的变形。

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

349. 两个数组的交集

题目链接:力扣349题链接
文章讲解:图文讲解
视频讲解:代码训练营

给定两个数组 nums1 和 nums2,返回它们的交集输出结果中的每个元素一定是唯一 的我们可以不考虑输出结果的顺序 。

提示:

1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000

样例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]     
样例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的  
思路

这题使用unorderset处理,对于重复数据过筛。再把第二个数组中的每个元素和set里的数比较,找得到说明是公共元素,留下。

实战
class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> re;
        unordered_set<int> n(nums1.begin(),nums1.end());
        for(auto i:nums2){
            auto b=n.find(i);
            if(b!=n.end())
                re.insert(i);
        }
        vector<int> result(re.begin(),re.end());
        return result;
       
    }
};
踩坑

最后要把set的数据赋值到vector里,这步卡了半天。。。后来发现STL真好用啊!!

202. 快乐数

题目链接:快乐数
文章讲解:图文讲解

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

提示:

1 <= n <= 2^31 - 1

样例1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1  
样例2:
输入:n = 2
输出:false
思路

这题思路之前一直搞不懂,一点都不快乐。。。。
后来看了讲解,不快乐数就是有循环的,那直接用set就可以解决了。
这题码一下,下次可以继续做。

实战
class Solution {
public:
    int sumofnum(int num){
        int sum=0;
        while(num){
            sum+=pow(num%10,2);
            num/=10;
        }
        return sum;
    }
    bool isHappy(int n) {
        int sum;
        unordered_set<int> myset;
        while(1){
            sum=sumofnum(n);
            if(sum==1)
                return true;
            if (myset.find(sum) != myset.end()) {
                return false;
            } else {
                myset.insert(sum);
            }
            n=sum;
        }
        

    }
};
踩坑

1.最后返回的是指针,不是val。不相交的话返回null就行。

1. 两数之和

题目链接:两数之和
文章讲解:图文讲解
视频讲解:代码随想录

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

样例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
样例2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
样例3:
输入:nums = [3,3], target = 6
输出:[0,1]
思路

这题是力扣的第一题,梦开始的地方。但是用哈希表的方式这是第一次做。

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

1.最后返回的是pair键值对
2.没有符合条件的话返回{}就行。

总结

今天主要学习了哈希表的一系列操作,复习了一下set,map还有STL的用法!受益颇多!继续加油!
加油,坚持打卡的第六天。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值