刷题训练营之哈希表(一)

本文介绍了如何使用C语言解决三种算法问题:有效字母异位词(比较两个字符串中字符出现的次数),找到两个数组的交集(并去重),以及判断快乐数(检查数的各位平方和是否形成循环)。文章提供了详细的思路解析和代码实现。
摘要由CSDN通过智能技术生成


前言

在这里插入图片描述


虽然很多题目使用C++中的unorder_map来解题,但是本篇主要采用C语言来解题

一、有效的字母异位词

1.题目介绍

题目在力扣的242. 有效的字母异位词
在这里插入图片描述

2.思路

两个字母是不是异位词,通俗来讲,就是判断两个字符串里面的数字出现的次数是不是一样的,如果是一样的,那就是异位字符串,否则就不是,那么如何统计一个字符串里的所有的字符的个数呢?我们可以用两个数组来分别映射这两字符串中每个字符出现的次数,如果这两个数组完全一样的话,那么就可以说明这两字符串时异位词了,这种方法是比较容易想到的,我们加以优化,用一个数组存储其中一个字符串里的字符出现的次数,然后减掉另外一个字符串出现的字符次数,结尾判断数组中的所有元素是不是都为0

3.代码

bool isAnagram(char * s, char * t){
    int res[26] = {0};
    int len1 = strlen(s);
    int len2 = strlen(t);
    for(int i = 0; i < len1; i++)
    {
        res[s[i] - 'a']++;
    }
    for(int i = 0; i < len2; i++)
    {
        res[t[i] - 'a']--;?//用第一个字符串中出现的字符的次数减去第二个字符串中字符出现的次数
    }
    for(int i = 0; i < 26; i++)
    {
        if(res[i] != 0)
            return false;
    }
    return true;
}

二、两个数组的交集

1.题目介绍

题目在力扣两个数组的交集
在这里插入图片描述

2.思路

与上一题的思路类似,但是此时我们就不减掉重的元素了,我们需要额外开一个数组来保存交集,同时我们需要来去重(注意答案的交集里的元素是要去重的)

3.代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    int hash[1005]={0};
    int *arr =(int *)malloc(sizeof(int)*1005);
    int j=0;
    for(int i=0;i<nums1Size;i++)
    {
        hash[nums1[i]]=1;
    }
    for(int i=0;i<nums2Size;i++)
    {
        if(hash[nums2[i]]==1)
        {
            arr[j]=nums2[i];
            j++;
            hash[nums2[i]]=0;//这一步是为了去重,只让该元素出现一次
        }
    }
    *returnSize=j;
    return arr;

}

三、快乐数

1.题目介绍

题目在力扣快乐数
在这里插入图片描述

2.思路

此题我们需要思考2个问题
1.怎么求一个数的各位数的平方之和
2.怎么判断进入了死循环

1.平方和就把一个数的每一个位数提取出来,然后平方就行了
2.死循环就用是否会出现重复的sum来判断

3.代码

int getsum(int x)
{
    int sum=0;
    while(x)
    {
        sum+=pow(x%10,2);
        x/=10;
    }
    return sum;
}
bool isHappy(int n){
    int hash[1000]={0};
    int sum;
    sum=getsum(n);
    while(sum!=1)
    {
        if(hash[sum]!=1)
        {
            hash[sum]=1;
        }
        else
        {
            return false;
        }
        sum=getsum(sum);
    }
    return true;
}
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ruiren.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值