代码随想录算法训练营第5天|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ●202. 快乐数● 1. 两数之和

本文介绍了在代码随想录算法训练营的第五天中,作者详细讲解了哈希表理论基础,并通过实例展示了如何解决LeetCode上的四个问题:有效字母异位词、两个数组的交集、快乐数和两数之和,强调了哈希表在这些问题中的关键作用。
摘要由CSDN通过智能技术生成

系列文章目录

代码随想录算法训练营第5天|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ●202. 快乐数● 1. 两数之和

题目

代码随想录算法训练营第5天|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ●202. 快乐数● 1. 两数之和


1. 有效的字母异位词

leetcode题目242链接: 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

做题中遇到问题:
字符串长度函数 strlen,用sizeof(s)会出错;
hashtable要置零 hashtable={0}。

bool isAnagram(char* s, char* t) {
    int hashtable[26]= {0};
    for(int i = 0; i <strlen(s); i++)
    {
        hashtable[s[i]-'a']++;
    }
    for(int j = 0; j <strlen(t); j++)
    {
        hashtable[t[j]-'a']--;
    }
    for(int k = 0; k <26; k++)
    {
        if (hashtable[k] != 0)
        return 0;
    }
    return 1;
}

2.两个数组的交集

leetcode题目链接:两个数组的交集

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

int result[1000]会报错。
出错提示
Line 207: Char 3: runtime error: load of null pointer of type ‘int’ (Serializer.c)
原因是因为result是局部变量。链接: 局部变量报错

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int hashtable[1000] = {0};
    int hashtable2[1000] = {0};
    int* result =(int*)malloc(sizeof(int)*1000);
    for (int i =0; i< nums1Size; i++)
    {
        hashtable[nums1[i]]++;
    }
    int count =0;
    for (int j =0; j < nums2Size; j++)
    {
        hashtable2[nums2[j]]++;
    }

    for (int k = 0; k <1000; k++)
    {
        if (hashtable[k] * hashtable2[k] > 0)
        {
            result[count] = k;
            count ++;
        }
    }
    *returnSize = count ;  
    return result;  
}

3.快乐数

leetcode题目链接:环形链表
编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

bool isHappy(int n) {
    int hashtable[2000] = {0};
    int sum = 0;

   while (n>0) 
   {
		while(n>0)
	    {   sum = sum + (n %10) *(n % 10);
	        n = n/10;
	    }
	
	    if (sum ==1)
	    {
	        return 1 ;
	    }
	    else
	    {
	        hashtable[sum]++;
	        if(hashtable[sum]>1)
	        {
	            return 0;
	        }
	        n =sum;
	        sum = 0;
	    }
   	}
   	return 1;
	}
}


4.两数之和

leetcode题目链接:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

C语言得自己定义一个map容器。 不如C++方便。

 typedef struct {
     int key;
     int value;
     UT_hash_handle hh; // make this structure hashable
 } map;

map* hashMap = NULL;

 void hashMapAdd(int key, int value){
     map* s;
     // key already in the hash?
     HASH_FIND_INT(hashMap, &key, s);
     if(s == NULL){
         s = (map*)malloc(sizeof(map));
         s -> key = key;
         HASH_ADD_INT(hashMap, key, s);
     }
     s -> value = value;
 }

map* hashMapFind(int key){
     map* s;
     // *s: output pointer
     HASH_FIND_INT(hashMap, &key, s);   
     return s;
 }

 void hashMapCleanup(){
     map* cur, *tmp;
     HASH_ITER(hh, hashMap, cur, tmp){
         HASH_DEL(hashMap, cur);
         free(cur);
     }
 }

 void hashPrint(){
     map* s;
     for(s = hashMap; s != NULL; s=(map*)(s -> hh.next)){
         printf("key %d, value %d\n", s -> key, s -> value);
     }
 }

 
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int i, *ans;
    // hash find result
    map* hashMapRes; 
    hashMap = NULL;
    ans = malloc(sizeof(int) * 2);

    for(i = 0; i < numsSize; i++){
        // key 代表 nums[i] 的值,value 代表所在 index;
        hashMapAdd(nums[i], i);
    }

    hashPrint();

    for(i = 0; i < numsSize; i++){
        hashMapRes = hashMapFind(target - nums[i]);
        if(hashMapRes && hashMapRes -> value != i){
            ans[0] = i;
            ans[1] = hashMapRes -> value ;
            *returnSize = 2;
            return ans;
        }
    }
    
    hashMapCleanup();
    return NULL;
}

总结

● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ●202. 快乐数● 1. 两数之和
hashtable可以用数组,集合set或者映射map来表示。
使用map容器可以事半功背

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值