数据结构与算法第八天

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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值