当前位置: 首页 > article >正文

哈希表之哈希数组、HashSet

本次题目汇总

  • 数组形式
    • 242.有效的字母异位词
    • 283.赎金信
  • HashSet
    • 349.两个数组的交集
      • 集合转换为数组
    • 202.快乐数

数组形式

关键词:

  • key数字0-9 字母a-z
  • value对应键的出现频次

242.有效的字母异位词

题目简述:判断两个字符串是否都是由类型且数目相同的字符组成的(这里字符全是小写英文字母)。
思路:键和数组索引联系起来,x-'a'的形式,自动换成数组索引,分别统计两个单词的字母频次(数组记录),然后各单词依次比较即可。

class Solution {
    public boolean isAnagram(String s, String t) {
       int[] num1 = new int[26]; 
       int[] num2 = new int[26]; 
       //统计s中字母的频次
       for(char i:s.toCharArray()){
        num1[i-'a']++;
       } 
       //统计t中字母的频次      
       for(char i:t.toCharArray()){
        num2[i-'a']++;
       }
       //比较两个频次数组
       for(int i =0;i<26;i++){
            if(num1[i]!=num2[i]){
                return false;
            }
       }
       return true;
    }
}

注:本题可以只用一个数组进行字母统计,前一个++,后一个在统计后的数组各字母位--即可,最后判断数组是否有非零的字母。

温习内容:

  • toCharArray()可将字符串转变为char数组;
  • 遍历字符串中的某一位置可以用charAt(index);
  • 字符串长度得用size()函数获取。

283.赎金信

题目简述:判断字符串A 能不能由字符串B 里面的字符构成(这里字符全是小写英文字母)。
思路:和上一题一样,只需验证字符串A中是否有B不含有的字母即可。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] num = new int[26]; 
        for(char i:ransomNote.toCharArray()){
            num[i-'a']++;
        }       
        for(char i:magazine.toCharArray()){
            num[i-'a']--;
        }
        for(int i =0;i<26;i++){
            if(num[i]>0){
                return false;
            }
       }
       return true;
    }
}

HashSet

349.两个数组的交集

题目描述:求两个数组的相同元素并将每种输出一次。

  • 数组法
    • 思路:分别统计两个字符串中的字母频次,只要某个字母在两个字符串中都出现过(>0),即是交集元素。不过存储交集的数据结构不能为数组,因为交集大小未知,初始化大了返回的有多余的0,所以考虑动态数组。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash1 = new int[1001];
        int[] hash2 = new int[1001];
        for(int i : nums1)
            hash1[i]++;
        for(int i : nums2)
            hash2[i]++;
        List<Integer> resList = new ArrayList<>();
        for(int i = 0; i < 1001; i++)
            if(hash1[i] > 0 && hash2[i] > 0)
                resList.add(i);
        return  resList.stream().mapToInt(x -> x).toArray();
    }
}
  • HashSet法
    • hashSet中一种元素只出现一次,所以可以先提取A中的各类型元素形成特征集,然后根据特征集查询B中的元素。
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        Set<Integer> result  = new HashSet<>();
        //遍历数组1放入set
        for (int i : nums1) {
            set.add(i);
        }
        //遍历数组2的过程中判断哈希表中是否存在该元素放入result(比较查找且去重)
        for (int i : nums2) {
            if (set.contains(i)) {
                result.add(i);
            }
        }
        return result.stream().mapToInt(x -> x).toArray();
    }
}

上述两种方法中最后都有这么一句stream().mapToInt(x -> x).toArray(),这里再开个小章节总结一下。

集合转换为数组

有关集合的概念参考博文——java集合(超详细)、Java集合全解【完整版】。
在这里插入图片描述
在这里插入图片描述
List、Set、Map都是接口,下面的为实现类,所以会有上述两方法中的 List<Integer> resList = new ArrayList<>(); Set<Integer> result = new HashSet<>();

本题需要返回int[ ],toArray()是集合的一种方法用于将集合中的元素转换为数组,不过这里返回的是Object[ ] 对象数组(存储的是对象类型),所以需要stream().mapToInt(x -> x)toArray()两个方法结合使用。先用stream()创建一个流对象,再用mapToInt(x -> x)(这里的x代指流对象中的元素,其他用法例如x->x.size())将集合中的每个元素映射int,最后用toArray()将结果收集到int数组中。

202.快乐数

题目描述:给定一个数n,要求将每一位平方后相加得到一个新数,看能否变成1
思路:可以看成一个不断生成数据的动态数组,这个无非两种情况,一是最后变成1二是中间某个数在前面出现过形成死循环了.

  • 判断一个数是否出现过,所以采用HashSet的contains函数(可以直接对空表检查)
  • 还需要一个循环不断去判断,首先判断新出的数是否直接是1了,是则返回;如果不是1再判断是否在死循环里,在循环里即返回此时的值,false;都不是则记录新的值。
class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
        //只记录非1且从未出现的新值
        while(n!=1&&!record.contains(n)){
            record.add(n);
            n = getSum(n);
        }
        return n==1;
    }
    //按位求和
    public int getSum(int n){
        int sum = 0;
        while(n>0){
            sum +=(n%10)*(n%10);
            n /=10;
        }
        return sum;
    }
}

在这里插入图片描述


http://www.kler.cn/news/367572.html

相关文章:

  • 西瓜书《机器学习》符号表KaTex表示
  • Python | Leetcode Python题解之第509题斐波那契数
  • Linux常用命令1
  • Ubuntu20.04安装VM tools并实现主机和虚拟机之间文件夹共享
  • UML 总结(基于《标准建模语言UML教程》)
  • 10.22.2024刷华为OD C题型(三)--for循环例子
  • 随机变量、取值、样本和统计量之间的关系
  • 智能科学与技术(一级学科)介绍
  • 从0开始深度学习(16)——暂退法(Dropout)
  • C++笔记---位图
  • PHP如何抛出和接收错误
  • C语言[求x的y次方]
  • 7.hyperf安装【Docker】
  • 京东电商下单黄金链路:防止订单重复提交与支付的深度解析
  • Pseudo Multi-Camera Editing 数据集:通过常规视频生成的伪标记多摄像机推荐数据集,显著提升模型在未知领域的准确性。
  • 背包九讲——混合背包问题
  • 虾类图像分割系统:改进亮点优化
  • 前端项目接入sqlite轻量级数据库sql.js指南
  • ffmpeg视频滤镜: 色温- colortemperature
  • Windows 11 绕过 TPM 方法总结,24H2 通用免 TPM 镜像下载 (Updated Oct 2024)
  • java项目之在线考试系统设计与实现(springboot)
  • 通过AWS Bedrock探索 Claude 的虚拟桌面魔力:让 AI 代替你动手完成任务!
  • 时间数据可视化基础实验(南丁格尔玫瑰图)——Python热狗大胃王比赛数据集
  • 蓝桥杯普及题
  • Android中导入讯飞大模型ai智能系统
  • nodejs写入日志文件