刷题随笔(2024.1.23)

 242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s 和 t 仅包含小写字母

题解:

bool isAnagram(char* s, char* t) {
    if(strlen(s)!=strlen(t)){
        return false;
    }
    int record[26];
    for(int j=0;j<26;j++){
        record[j]=0;
    }
    int x;
    int y;
    for(int i=0;i<strlen(s);i++){
        x=s[i]-'a';
        record[x]++;
    }
    for(int k=0;k<strlen(t);k++){
        y=t[k]-'a';
        record[y]--;
    }
    for(int m=0;m<26;m++){
        if(record[m]!=0){
            return false;
        }
    }
    return true;
}

思路:哈希表中利用数组求解,首先判断两个字符串的长度,若不相同则直接返回false。根据题设条件给出了仅包含小写字母的条件,可以利用一个长度为26的数组记录每个字母出现的次数,首先遍历s数组,将相应位置的数值+1记录s字符串中每个数字出现的频次,在遍历t字符串时将对应位置的数值-1,若哈希表最终能回到全0的状态则返回true,否则返回false。

笔记: C语言中表示字符串的长度使用strlen()函数。 不必记得a的ASCLL码值,直接减去'a'即可。

349.两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

 题解:

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int record[1000];
    int m=0;
    int lessSize=nums1Size>nums2Size?nums2Size:nums1Size;
    int* result=(int*)malloc(lessSize*sizeof(int));
    for(int j=0;j<1000;j++){
        record[j]=0;
    }
    for(int i=0;i<nums1Size;i++){
        record[nums1[i]]++;
    }
    for(int k=0;k<nums2Size;k++){
        if(record[nums2[k]]!=0){
            result[m]=nums2[k];
            m++;
            record[nums2[k]]=0;
        }
    }
    *returnSize=m;
    return result;
}

思路:题设给出了数值小于1000的提示,所以依然可以用哈希表来解决,定义一个长度为1000的哈希表,在定义一个存放结果的动态数组,长度取两个数组长度的最小值,先遍历nums1数组,将其出现过的数值作为结果数组的下标,使对应结果数组单元+1,再遍历nums2数组,如果对应下标的结果数组数值不为0,则表示nums中出现过该值,将该值记录进结果数组中并且将其置为0避免重复。最后输出结果数组。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值