242、有效的字母异位词
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。 注意:
若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
解题思路:查找一个元素是否在集合中出现过,典型的哈希表的思想,哈希表就是查找关键
码的值,关键码指的就是数组下标,假设我们查找的数字6,我们就让6作为哈希表的下标,而下标
6所对应的值加一;具体代码如下:
class Solution {
public:
bool isAnagram(string s, string t) {
int hash[26]={0}; //构造一个哈希表,由于是小写字母
//1.由于我们要在s中查找是否存在能构造t的字符,因此我们把s中出现的字符作为哈希表
for(int i=0;i<s.size();i++){
hash[s[i]-'a']++; //由于哈希表的下标0-26,a对应的是0,b对应的是1,以此类推;
}
for(int i=0;i<t.size();i++){
hash[t[i]-'a']--; //查找t中的每个元素是否在哈希表中存在过,如果存在的话,哈希表对应的字符频率减一,如果有的字符频率出现了负数,说明原来哈希表中该字符出现的次数少于t中字符出现的次数,
}
//3.检查一下,如果这26个下标对应的频数有小于0的,说明了t中有的字符在哈希表中是不存在的,
for(int i=0;i<26;i++){
if(hash[i]!=0){
return false;
}
}
return true;
}
};
349、两个数组的交集
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯
一 的。我们可以 不考虑输出结果的顺序 。
本题的思路是啥呢? 假设我们先将nums1数组中各个元素值作为哈希表得下标,然后再对
nums2数组中的元素进行查找,看看其是否在哈希表中出现过,如果hash[t[i]]>0,说明这个数字是
第一次出现过的,就将其加入到结果数组中去,然后将这个数字对应的频率置为零,为啥将其对应
的频率置为零呢,因为题目要求我们重复的数字只能用一次,所以当后面出现了这个元素时,就不
用再把他加入到结果数组中去了。
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
//1.注意提示,两个数组的长度最多为1000,数据不算大,可用哈希表数组形式的结构
if(nums1Size==0 || nums2Size==0) return NULL;
int hash[1001],i; //0<=nums[i]<=1000;
memset(hash,0,sizeof(hash));
for(i=0;i<nums1Size;i++){
hash[nums1[i]]++;
}
int *ret=(int*)malloc(sizeof(int)*1001);
memset(ret,0,sizeof(ret));
int k=0;
for(i=0;i<nums2Size;i++){
if(hash[nums2[i]]>0){
ret[k++]=nums2[i]; //说明此时有这个数字;
hash[nums2[i]]=0; //这个数字已经有了,重复的不用了;
}
}
*returnSize=k;
return ret;
}
350、两个数组的交集II
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个
元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小
值)。可以不考虑输出结果的顺序。
这一题与上面的差不多,区别就是本题要求只要两个数组有相同的数字就写入结果数组中
去,相同的数字包括重复的数字,有几个重复的就写入几个,当将其放入结果数组中去时,不需要
将这个数字对应的频数置为零了;
int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
//1.为了节省空间,选用数组长度较小的;
int hash[1001]={0};
int *ret=(int *)malloc(sizeof(int)*1000);
memset(ret,0,sizeof(int));
for(int i=0;i<nums1Size;i++){
hash[nums1[i]]++;
}
int k=0;
for(int i=0;i<nums2Size;i++){
if(hash[nums2[i]]){ //如果当前的数字大于0说明有这个数字
ret[k++]=nums2[i];
hash[nums2[i]]--; //将这个数字对应的频数减一
}
}
*returnSize=k;
return ret;
}