力扣面试经典题之哈希表

简介: 力扣面试经典题之哈希表

383. 赎金信

简单

给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false

magazine 中的每个字符只能在 ransomNote 中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"

输出:false


示例 2:

输入:ransomNote = "aa", magazine = "ab"

输出:false


示例 3:

输入:ransomNote = "aa", magazine = "aab"

输出:true


提示:

  • 1 <= ransomNote.length, magazine.length <= 105
  • ransomNotemagazine 由小写英文字母组成
bool canConstruct(char* ransomNote, char* magazine) {
    int rr=strlen(ransomNote);
    int mm=strlen(magazine);
    int count=0;
    for(int i=0;i<rr;i++){
        for(int j=0;j<mm;j++){
            if(ransomNote[i]==magazine[j]){
               count++;
               magazine[j]=' ';
               break;
            }
        }
    }
    if(count==rr){
        return true;
    }
     return false;
}

205. 同构字符串

简单

给定两个字符串 st ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"

输出:true


示例 2:

输入:s = "foo", t = "bar"

输出:false

示例 3:

输入:s = "paper", t = "title"

输出:true

提示:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • st 由任意有效的 ASCII 字符组成
bool isIsomorphic(char* s, char* t) {
    int a[200],f[200]={0};
    for(int i=0;i<200;i++){
        a[i]=-1;
    }
    int ss=strlen(s);
    int tt=strlen(t);
    if(ss!=tt){
        return false;
    }
    for(int i=0;i<ss;i++){
        int p=s[i]-' ';
        if(a[p]==-1&&f[t[i]-' ']==0){
            a[p]=t[i]-' ';
            f[(t[i]-' ')]=1;
         }else if(a[p]==-1&&f[t[i]-' ']!=0){
                  return false;
         }else{
            if(a[p]!=t[i]-' '){
                   return false;
            }
       }
    }
    return true;
}

290. 单词规律

简单

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", s = "dog cat cat dog"

输出: true

示例 2:

输入:pattern = "abba", s = "dog cat cat fish"

输出: false

示例 3:

输入: pattern = "aaaa", s = "dog cat cat dog"

输出: false

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔
bool wordPattern(char* pattern, char* s) {
    char *hashset[26];
    for(int i=0;i<26;i++){
        hashset[i]=NULL;
    }
    int pp=strlen(pattern);
    const char ff[2]=" ";
    char *token=NULL;
    for(int i=0;i<pp;i++){
      
        if(token == NULL){
            token = strtok(s, ff);
        }
        else{
             token = strtok(NULL, ff);
             if(token == NULL) {
                 return false;
             }
        }
        if(hashset[pattern[i]-'a']==NULL){
            
                 hashset[pattern[i]-'a']=token;
       }else{
           if(strcmp(hashset[pattern[i]-'a'],token)!=0){
                   return false;
            }
        }
    }
    token = strtok(NULL, ff);
    if(token != NULL)
    {
        return false;
    }
    for(int i =0; i < 26; i++)
    {
        if(hashset[i]!= NULL)
        {
            for(int j = i+ 1; j < 26; j++)
            {
                if(hashset[j]!= NULL)
                {
                    if(strcmp(hashset[i], hashset[j]) == 0)
                    {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

242. 有效的字母异位词

简单

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

注意:st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"

输出: true


示例 2:

输入: s = "rat", t = "car"

输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • st 仅包含小写字母
bool isAnagram(char* s, char* t) {
    int snum[26]={0};
    int tnum[26]={0};
    int ss=strlen(s);
    int tt=strlen(t);
    for(int i=0;i<ss;i++){
        snum[s[i]-'a']++;
    }
    for(int i=0;i<tt;i++){
        tnum[t[i]-'a']++;
    }
    for(int i=0;i<26;i++){
        if(snum[i]!=tnum[i]){
            return false;
        }
    }
    return true;
}

1. 两数之和

简单

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

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

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

示例 1:

输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。


示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]


示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]


提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int *a=(int*)malloc(sizeof(int)*2);
    for(int i=0;i<numsSize;i++){
        for(int j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
               a[0]=i;
               a[1]=j;
               (*returnSize)=2;
                break;
            }
        }
    }
     return a;
}
目录
相关文章
|
2天前
|
Java
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
7 1
|
3天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
20 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
3天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
1月前
|
C++ 索引
【力扣经典面试题】14. 最长公共前缀
【力扣经典面试题】14. 最长公共前缀
|
1月前
|
C++
【力扣经典面试题】58. 最后一个单词的长度
【力扣经典面试题】58. 最后一个单词的长度
|
1月前
|
算法 Java
【力扣经典面试题】12. 整数转罗马数字
【力扣经典面试题】12. 整数转罗马数字
|
1月前
|
索引
[经典力扣面试题]135. 分发糖果
[经典力扣面试题]135. 分发糖果
|
1月前
|
算法 C++ 索引
【力扣经典面试题】238. 除自身以外数组的乘积
【力扣经典面试题】238. 除自身以外数组的乘积
|
1月前
|
存储 安全 Java
大厂面试题详解:java中有哪些类型的锁
字节跳动大厂面试题详解:java中有哪些类型的锁
59 0
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
11 0