2022.6.7
今日主题—哈希表
题目描述:
给你一个长度为
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;
}
我的思路:
很基础的哈希表
题目描述:
如果两个字符串
word1
和word2
中从'a'
到'z'
每一个字母出现频率之差都 不超过3
,那么我们称这两个字符串
word1
和word2
几乎相等 。给你两个长度都为
n
的字符串word1
和word2
,如果word1
和word2
几乎相等 ,请你返回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
,都满足数位i
在num
中出现了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;
}
我的思路:
第一步统计数组中每个数字出现次数
第二步比较哈希表中的值是否和数字字符串中的值一致
最好在草稿纸上画画,直接出来