2022/5/7(哈希表)
本来已经写好了结果电脑没电。。重新随便写写了
题目描述:
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
|x| 的值定义为:
如果 x >= 0 ,那么值为 x 。
如果 x < 0 ,那么值为 -x 。
我的题解:
int countKDifference(int* nums, int numsSize, int k){
//nums[i]-nums[j]==+-k---nums[i]-k=nums[j]---nums[j]=nums[i]+k
//枚举出所有可能
int hashmap[101],i,count;
memset(hashmap,0,sizeof(hashmap));
for(i=0;i<numsSize;++i){
int temp=nums[i]+k;
if(temp>=0&&temp<=100){
count+=hashmap[temp];
}
temp=nums[i]-k;
if(temp>=0&&temp<=100){
count+=hashmap[temp];
}
//关键字当作下标进行映射
++hashmap[nums[i]];//还有个目的是为了保证i《j
}
return count;
}
我的思路:
直接定址法
题目描述:
给你一个整数数组 nums 。
如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
返回好数对的数目。
我的题解:
int numIdenticalPairs(int* nums, int numsSize){
int hashmap[101]={0};
int res=0;
for(int i=0;i<numsSize;++i){
hashmap[nums[i]]++;
}
for(int i=0;i<101;++i){
while(hashmap[i]){
//4--3+2+1 5--(5*4)/2--4+3+2+1
hashmap[i]--;
res+=hashmap[i];
}
}
return res;
}
我的思路:
直接定址法
题目描述:
给你两个长度相等的字符串 s 和 t。每一个步骤中,你可以选择将 t 中的 任一字符 替换为 另一个字符。
返回使 t 成为 s 的字母异位词的最小步骤数。
字母异位词 指字母相同,但排列不同(也可能相同)的字符串。
我的题解:
int minSteps(char * s, char * t){
int hashmaps[26]={0};
int hashmapt[26]={0};
int len=strlen(s);
for(int i=0;i<len;++i){
//由于字符串以"/0"结尾所以遍历到0就退出循环
hashmaps[s[i]-'a']++;
hashmapt[t[i]-'a']++;
}
int count=0;
//再依次取出对比,相差几次就要换几次
for(int i=0;i<26;++i){
if(hashmaps[i]){
count+=hashmaps[i]>hashmapt[i]?hashmaps[i]-hashmapt[i]:0;
}
}
return count;
}
我的思路:
建两个hash表分别来存放各个字符串的字母个数,对比即可,减去a是为了节省空间,这算是算取余法呢hhh
题目描述
没时间了下次一定,回去复习计组了呜呜