[刷题计划]第二周第五天 | 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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XingleiGao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值