六月集训第七日-哈希表

2022.6.7

今日主题—哈希表

题目描述:

442. 数组中重复的数据 - 力扣(LeetCode)

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现

两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。

我的题解:
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findDuplicates(int* nums, int numsSize, int* returnSize){
   //由时间复杂度可用哈希表
   int *ret=(int*)malloc(sizeof(int)*numsSize);
   int Hash[100001]={0};
   int index=0;
   int count=0;//记录放入数组长度
   for(int i=0;i<numsSize;++i){
       Hash[nums[i]]++;
       if(Hash[nums[i]]>1){
           //说明出现了两次
           //放入str数组
           ret[index++]=nums[i];
           count++;
       }
   }
   *returnSize=count;
   return ret;
}
我的思路:

很基础的哈希表

在这里插入图片描述

题目描述:

2068. 检查两个字符串是否几乎相等 - 力扣(LeetCode)

如果两个字符串 word1word2 中从 'a''z' 每一个字母出现频率之差都 不超过 3 ,那么我们称

这两个字符串 word1word2 几乎相等

给你两个长度都为 n 的字符串 word1word2 ,如果 word1word2 几乎相等 ,请你返回 true

否则返回 false

一个字母 x 的出现 频率 指的是它在字符串中出现的次数。

我的题解:
#define maxsize 26
bool checkAlmostEquivalent(char * word1, char * word2){
    int hash[maxsize]={0};
    for(int i=0;i<strlen(word1);++i){
        hash[word1[i]-'a']++;
    }
    int hash1[maxsize]={0};
    for(int i=0;i<strlen(word2);++i){
        hash1[word2[i]-'a']++;
    }
    for(int i=0;i<maxsize;++i){
        if(abs(hash[i]-hash1[i])>3){
            return false;
        }
    }
    return true;
}


我的思路:

创建两个hash表分别统计俩个数组,在比较即可

在这里插入图片描述

题目描述:

给你一个下标从 0 开始长度为 n 的字符串 num ,它只包含数字。

如果对于 每个 0 <= i < n 的下标 i ,都满足数位 inum 中出现了 num[i]次,那么请你返

true ,否则返回 false

我的题解:
#define hashsize 11
//怎么那么绕隔这二人转是吧
int Code(char a){
    return a-'0';
}
bool digitCount(char * num){
    int hash[11]={0};
    //先做哈希计数
    for(int i=0;i<strlen(num);++i){
        hash[Code(num[i])]++;
    }
    //然后比较是否每个值与等于数字字符串中的数字大小
    for(int j=0;j<strlen(num);j++){
        if(hash[j]!=Code(num[j])){
            return false;
        }
    }
    return true;
}
我的思路:

第一步统计数组中每个数字出现次数

第二步比较哈希表中的值是否和数字字符串中的值一致

最好在草稿纸上画画,直接出来

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值