力扣刷题篇——哈希表

简介: 力扣刷题篇——哈希表

442 题目描述💥:


给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。


你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。


示例 1:

输入:nums = [4,3,2,7,8,2,3,1]

输出:[2,3]


示例 2:

输入:nums = [1,1,2]

输出:[1]


示例 3:

输入:nums = [1]

输出:[]


解题思路💥:

根据题目要求 使用额外的空间来解决


我们开辟一个空间大小相等的数组


遍历一遍数组

如果有重复的元素就add到list中

最后以数组方式返回就行

代码附上💥:

class Solution {
    public List<Integer> findDuplicates(int[] nums) {
        List<Integer>list =new ArrayList<>();
        int arr[]=new int [nums.length];
        for(int i=0;i<nums.length;i++){
            if(nums[i]==arr[nums[i]-1]){
                list.add(nums[i]);
            }else{
                arr[nums[i]-1]=nums[i];
            }
        }
        return list;
        }
    }

2283题目描述💥:


给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。


你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。


示例 1:

输入:nums = [4,3,2,7,8,2,3,1]

输出:[2,3]


示例 2:

输入:nums = [1,1,2]

输出:[1]


示例 3:

输入:nums = [1]

输出:[]


解题思路💥:

这道题直接统计数字出现的次数即可

遍历统计数字出现的次数

如果下标i满足在num中出现了num[i]次 那么就返回true 反之返回false

代码附上💥:  

class Solution {
    public boolean digitCount(String num) {
        int len=num.length();
        int []map=new int [10];
        for(int i=0;i<len;i++){
            //统计数字出现的次数
            map[num.charAt(i)-'0']++;
        }
        for(int i=0;i<len;i++){
            if(map[i]!=num.charAt(i)-'0') return false;
        }
            return true;
    }
}

884题目描述💥:


句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。


如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。


给你两个 句子 s1 和 无序列表s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。


示例 1:

输入:s1 = "this apple is sweet", s2 = "this apple is sour"

输出:["sweet","sour"]


示例 2:

输入:s1 = "apple apple", s2 = "banana"

输出:["banana"]


解题思路💥:

创建一个字符串数组用来拼接两个字符串

用哈希表映射统计每个字符串出现的次数

对哈希表进行一遍遍历 把所有值为1的键放入

如果出现的次数为1 就是题目说的唯一的不常见字符串


代码详解💥:

class Solution {
    public String[] uncommonFromSentences(String s1, String s2) {
        //创建一个字符串数组将两个字符串拼接起来
        String []AB=(s1+" "+s2).split(" ");
        //计算每个字符串出现的次数
        Map<String,Integer>map=new HashMap<>();
        for(int i=0;i<AB.length;i++){
            map.put(AB[i],map.getOrDefault(AB[i],0)+1);
        }
        //如果出现的次数为1 就是题目说的唯一的不常见字符串
        List<String>list=new ArrayList<>();
        for(String key:map.keySet()){
            if(map.get(key)==1){
                list.add(key);
            }
        }
        String []res=new String[list.size()];
        return list.toArray(res);
    }
}

2068 题目描述💥:


如果两个字符串 word1 和 word2 中从 'a' 到 'z' 每一个字母出现频率之差都 不超过 3 ,那么我们称这两个字符串 word1 和 word2 几乎相等 。


给你两个长度都为 n 的字符串 word1 和 word2 ,如果 word1 和 word2 几乎相等 ,请你返回 true ,否则返回 false 。


一个字母 x 的出现 频率 指的是它在字符串中出现的次数。


示例 1:

输入:word1 = "aaaa", word2 = "bccb"

输出:false

解释:字符串 "aaaa" 中有 4 个 'a' ,但是 "bccb" 中有 0 个 'a' 。

两者之差为 4 ,大于上限 3 。


示例 2:

输入:word1 = "abcdeef", word2 = "abaaacc"

输出:true

解释:word1 和 word2 中每个字母出现频率之差至多为 3 :

- 'a' 在 word1 中出现了 1 次,在 word2 中出现了 4 次,差为 3 。

- 'b' 在 word1 中出现了 1 次,在 word2 中出现了 1 次,差为 0 。

- 'c' 在 word1 中出现了 1 次,在 word2 中出现了 2 次,差为 1 。

- 'd' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。

- 'e' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。

- 'f' 在 word1 中出现了 1 次,在 word2 中出现了 0 次,差为 1 。


示例 3:

输入:word1 = "cccddabba", word2 = "babababab"

输出:true

解释:word1 和 word2 中每个字母出现频率之差至多为 3 :

- 'a' 在 word1 中出现了 2 次,在 word2 中出现了 4 次,差为 2 。

- 'b' 在 word1 中出现了 2 次,在 word2 中出现了 5 次,差为 3 。

- 'c' 在 word1 中出现了 3 次,在 word2 中出现了 0 次,差为 3 。

- 'd' 在 word1 中出现了 2 次,在 word2 中出现了 0 次,差为 2 。


解题思路💥:

创建一个26大小空间的数组 用来存'a'-'z'字母的次数

遍历word1 和word2两个字符串

第一个字符串出现就++,第二个出现就--

最后判断绝对值如果超过3就返回false 反正返回true!

代码附上💥:

class Solution {
    public boolean checkAlmostEquivalent(String word1, String word2) {
      int res[]=new int[26]; //统计字符'a'到字符'z'出现的次数
      for(char c1:word1.toCharArray()){
          res[c1-'a']++;
      }
      for(char c2:word2.toCharArray()){
          res[c2-'a']--;
      }
    // for(int i=0;i<word1.length();i++){
    //     res[word1.charAt(i)-'a']++;
    // }
    //    for(int i=0;i<word2.length();i++){
    //     res[word2.charAt(i)-'a']--;
    // }
      for(int i=0;i<26;i++){
          if(Math.abs(res[i])>3){
              return false;
          }
      }
        return true;
    }
}


相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
59 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
52 4
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
35 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
66 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
29 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
29 4