代码随想录算法训练营第一周(C语言与Python实现)|Day01-04(数组与链表)

@ 代码随想录算法训练营第二周(C语言与Python实现)|Day06(哈希表)。

Day6、哈希表(包含题目 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数1. 两数之和 )

242.有效的字母异位词

题目描述

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

题目解答

int search(int* nums, int numsSize, int target) {
bool isAnagram(char* s, char* t) {
    int hashmap[26];
    memset(hashmap,0,sizeof(hashmap));

    for(int i=0;i<strlen(s);i++){
        hashmap[s[i]-'a']++;
    }
    for(int j=0;j<strlen(t);j++){
        hashmap[t[j]-'a']--;
    }
    for(int i=0;i<26;i++){
        if(hashmap[i]!=0){
            return false;
        }
    }
    return true;

}

题目总结

很经典的哈希表题目,适合新手入门。

349. 两个数组的交集

题目描述

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

题目解答

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
    int size=nums1Size>nums2Size?nums2Size:nums1Size;
    int *res=(int*)calloc(size,sizeof(int));

    int hashmap[1001]={0};
    for(int i=0;i<nums1Size;i++){
        hashmap[nums1[i]]++;
    }
    int k=0;
    for(int i=0;i<nums2Size;i++){
        if(hashmap[nums2[i]]>0){
            res[k++]=nums2[i];
            hashmap[nums2[i]]=0;
        }

    }
    *returnSize=k;

    return res;
}

题目总结

需要注意的点:保证唯一性,需要hashmap[nums2[ i ] ] = 0;这个归零操作。

202. 快乐数

题目描述

编写一个算法来判断一个数 n 是不是快乐数。

题目解答

int getsum(int n){
    int sum=0;
    while(n/10!=0){
        sum+=(n%10)*(n%10);
        n=n/10;
    }
    sum+=n*n;


    return sum;
}
bool isHappy(int n) {
    int hashmap[10000]={0};

    int sum=getsum(n);
    hashmap[sum]++;

    while(sum!=1){
        
        sum=getsum(sum);
        
        if(hashmap[sum]==1){
            return false;
        }
        hashmap[sum]++;
    }
    return true;

}

题目总结

需要注意的点:求sum是用平方和,只要n(假设大于1000)足够大,sum一定是取在小于n的范围内的,在这个小于n的范围内最多取n次,就会出现重复了(我是这么理解的)。

1. 两数之和

题目描述

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

题目解答

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int*res=(int*)calloc(2,sizeof(int));
    for(int i=0;i<numsSize;i++){
        for(int j=0;j<numsSize;j++){
            if(i==j){
                continue;
            }
            if(nums[i]+nums[j]==target){
                res[0]=i;
                res[1]=j;
                *returnSize=2;
                return res;
            }
        }
    }
    *returnSize=0;
    return NULL;

}

题目总结

需要注意的点:这一题使用哈希表对于c来说比较复杂,还是乖乖使用暴力解法来做吧。

你可能感兴趣的:(算法,c语言,python)