《六月集训》第七天——哈希表


前言

        
刷题坚持每一天,以下题目引用自:力扣(LeetCode)

💎一、题目一

🏆1.题目描述

原题链接:442. 数组中重复的数据

        给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
        你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

示例 1:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]

🏆2.解题思路

🔑思路:

​         hash记录每个值的出现次数,当有值出现两次时记录这个值。

🏆3.代码详解

int* findDuplicates(int* nums, int numsSize, int* returnSize){
    int hash[100001] = {0};
    int* ans = (int*)malloc(sizeof(int)*numsSize);
    int idx = 0;
    for(int i = 0; i < numsSize; ++i){
        ++hash[nums[i]];
        if(hash[nums[i]] == 2){
            ans[idx++] = nums[i];
        }
    }
    * returnSize = idx;
    return ans;
}

💎二、题目二

🏆1.题目描述

原题链接:2068. 检查两个字符串是否几乎相等

        如果两个字符串 word1 和 word2 中从 ‘a’ 到 ‘z’ 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。
        给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。
        一个字母 x 的出现 频率 指的是它在字符串中出现的次数。

示例 1:
输入:word1 = “aaaa”, word2 = “bccb”
输出:false
解释:字符串 “aaaa” 中有 4 个 ‘a’ ,但是 “bccb” 中有 0 个 ‘a’ 。
两者之差为 4 ,大于上限 3 。

🏆2.解题思路

🔑思路:

​         两个hash分别记录两个字符串里的字符出现的次数。然后,判断这两个字符串里的值出现次数的绝对差是否超出三个。

🏆3.代码详解

bool checkAlmostEquivalent(char * word1, char * word2){
    int hashw1[26] = {0};
    int hashw2[26] = {0};
    for(int i = 0; word1[i] != '\0'; ++i){
        ++hashw1[word1[i]-'a'];
        ++hashw2[word2[i]-'a'];
    }
    for(int i = 0; i < 26; ++i){
        if(abs(hashw1[i] - hashw2[i]) > 3) return false;
    }
    return true;
}

💎三、题目三

🏆1.题目描述

原题链接:2283. 判断一个数的数字计数是否等于数位的值

        给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。
        如果对于 每个 0 <= i < n 的下标 i ,都满足数位 i 在 num 中出现了 num[i]次,那么请你返回 true ,否则返回 false 。

示例 1:
输入:num = “1210”
输出:true
解释:
num[0] = ‘1’ 。数字 0 在 num 中出现了一次。
num[1] = ‘2’ 。数字 1 在 num 中出现了两次。
num[2] = ‘1’ 。数字 2 在 num 中出现了一次。
num[3] = ‘0’ 。数字 3 在 num 中出现了零次。
“1210” 满足题目要求条件,所以返回 true 。

🏆2.解题思路

🔑思路:

​        hash记录每个字符出现的次数,每个下标对应的hash值就是下标值应该出现的次数。然后和字符值比较,不相等代表出现次数少或者多,返回false。如果循环完毕返回true。

🏆3.代码详解

bool digitCount(char * num){
    int hash[11] = {0};
    for(int i = 0; num[i] != '\0'; ++i){
        ++hash[num[i]-'0'];
    }
    for(int i = 0; num[i] != '\0'; ++i){
        if(hash[i] != num[i] - '0')
            return false;
    }
    return true;
}

💎四、题目四

🏆1.题目描述

原题链接:884. 两句话中的不常见单词

        句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。
        如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。
        给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。

示例 1:
输入:s1 = “this apple is sweet”, s2 = “this apple is sour”
输出:[“sweet”,“sour”]

🏆2.解题思路

🔑思路:

​         用C++ unordered_map ,这个没有排序功能。键做索引值,值就是hash计数值。先把两个字符串合成一个字符串,遍历这个字符串统计单词出现的次数。然后遍历hash,找出出现一次的单词。

🏆3.代码详解

class Solution {
public:
    vector<string> uncommonFromSentences(string s1, string s2) {
        unordered_map <string, int> hash;
        vector <string> ans;
        s1 += " ";
        s1 += s2;
        s1 += " ";
        char tem[201];
        int idx = 0;
        for(int i = 0; i < s1.size(); ++i){
            if(s1[i] == ' '){
                tem[idx] = '\0';
                hash[tem]++;
                idx = 0;
            } else tem[idx++] = s1[i];
        }
        for(auto i = hash.begin(); i != hash.end(); ++i){
            if(i->second == 1){
                ans.push_back(i->first);
            }     
        }
        return ans;
    }
};

💎五、星球推荐

        星球链接:英雄算法联盟

星球里有什么?
        【朋友圈】一个极致精准的自律、编程、算法的小圈子。
        【算法集训】以月为单位组织算法集训,每天四题,风雨无阻。
        【排行榜】每天、每周都会有榜单,激励大家不断进步,不断成长。
        【个人规划】每个人都写好自己的规划,也可以查看他人的规划,时刻警醒自己不掉队。
        【打卡挑战】每日一题打卡、每日早起打卡、算法集训打卡、规划完成情况打卡。
在星球里做什么?
        目前星球人数达到520+,在星球里你能够遇到一群志同道合之人,因为都是花钱进来的,你不会看到任何浑水摸鱼的人,每个人都有自己的每月规划,星主每月都会组织算法集训,每天一起刷题,你可以看到别人的解题报告,取其之长,补己之短。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值