前言
虽然很多题目使用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;
}