[刷题计划]第二周第五天 | hash

1436. 旅行终点站

1370. 上升下降字符串

1460. 通过翻转子数组使两个数组相等

2068. 检查两个字符串是否几乎相等

1935. 可以输入的最大单词数

1002. 查找共用字符 无题解

1207. 独一无二的出现次数

题解 

1436. 旅行终点站

char * destCity(char *** paths, int pathsSize, int* pathsColSize){
    char *hash[100],hashsize = 0,hashnum[100] = {0};
    for(int i = 0;i<pathsSize;i++){//插入hash表以及对应的hashnum
        int j = 0;
        for(j = 0;j < hashsize;j++)
            if(strcmp(hash[j],paths[i][1]) == 0) break;
        if(j == hashsize)   hashnum[hashsize] ++,hash[hashsize++] = paths[i][1];
        else hashnum[j]++;
    }
    for(int i = 0;i<pathsSize;i++){//如果出现在起始就标记为0
        for(int j = 0;j < hashsize;j++)
            if(strcmp(hash[j],paths[i][0]) == 0) hashnum[j] = 0;
    }
	    for(int j = 0;j < hashsize;j++)//找到入度为1的点就好了
        if(hashnum[j] == 1) return hash[j];
    return 0;
}

1370. 上升下降字符串 大水题

char * sortString(char * s){
    int hashnum[26] = {0},len = 0,anssize = 0;
    char *ans = malloc(sizeof(char)*510);
    for(int i = 0;s[i];i++){    //初始化hash表
        len++;
        hashnum[s[i]-'a']++;
    }
    while(len){
        for(int i = 0;i<26;i++)
            if(hashnum[i])  ans[anssize++] = i+'a',hashnum[i]--,len--;
        for(int i = 25;i>=0;i--)
            if(hashnum[i])  ans[anssize++] = i+'a',hashnum[i]--,len--;
    }
    ans[anssize++] = 0;
    return ans;
}

1460. 通过翻转子数组使两个数组相等

bool canBeEqual(int* target, int targetSize, int* arr, int arrSize){
    if(targetSize != arrSize)   return false;
    int hash[1001] = {0};
    for(int i = 0;i<targetSize;i++)
        hash[target[i]]++;
    for(int i = 0;i<arrSize;i++)
        if(hash[arr[i]]) hash[arr[i]]--;
        else return false;
    return true;
}

2068. 检查两个字符串是否几乎相等

bool checkAlmostEquivalent(char * word1, char * word2){
    char hash[26] = {0};
    for(int i = 0;word1[i];i++)
        hash[word1[i]-'a']++;
    for(int i = 0;word2[i];i++)
        hash[word2[i]-'a']--;
    for(int i = 0;i<26;i++)
        if(hash[i]>3||hash[i]<-3)   return false;
    return true;
}

1935. 可以输入的最大单词数

int canBeTypedWords(char * text, char * brokenLetters){
    bool hash[26];
    int ans = 0;
    memset(hash,0,sizeof(hash));
    for(int i = 0;brokenLetters[i];i++) //标记坏键盘
        hash[brokenLetters[i]-'a'] = 1;
    for(int i = 0;text[i];i++){
        int flag = 1;
        while(text[i]&&text[i]!=' ')
            if(hash[text[i++]-'a'])   flag = 0;
        if(flag)    ans++;
        if(!text[i]) i--;
    }
    return ans;
    
}

1207. 独一无二的出现次数

bool uniqueOccurrences(int* arr, int arrSize){
    int hash[2001] = {0};
    bool hashnum[1001];
    memset(hashnum,0,sizeof(hashnum));
    for(int i = 0;i < arrSize;i++)
        hash[arr[i]+1000]++;
    for(int i = 0;i <2001;i++)
        if(hash[i])
            if(!hashnum[hash[i]])   hashnum[hash[i]] = 1;
            else return false;
    return true;
}

猜你喜欢

转载自blog.csdn.net/qq_17593855/article/details/121431309