力扣刷题篇——哈希表

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

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;
    }
}


相关文章
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
41 6
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
35 4
|
1月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
73 2
|
1月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
36 7
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
17 4
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
40 5
|
1月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
36 3
|
1月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
15 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
28 3
|
1月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
21 4