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

算法总结-哈希表

文章目录

    • 1.赎金信
        • 1.答案
        • 2.思路
    • 2.字母异位词分组
        • 1.答案
        • 2.思路
    • 3.两数之和
        • 1.答案
        • 2.思路
    • 4.快乐数
        • 1.答案
        • 2.思路
    • 5.最长连续序列
        • 1.答案
        • 2.思路

1.赎金信

1.答案
package com.sunxiansheng.arithmetic.day14;

/**
 * Description: 383. 赎金信
 *
 * @Author sun
 * @Create 2025/1/22 11:10
 * @Version 1.0
 */
public class t383 {

    public static boolean canConstruct(String ransomNote, String magazine) {
        // 字符频率数组
        int[] frequency = new int[26];
        // 将magazine的字符频率统计一下
        for (char c : magazine.toCharArray()) {
            frequency[c - 'a']++;
        }
        // 遍历一下ransomNote,看看够不够减
        for (char c : ransomNote.toCharArray()) {
            if (--frequency[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}
2.思路

就是利用一个字母减去’a’的范围是在0到25的,来统计一下字符的频率数组,之后再看一下够不够减即可

2.字母异位词分组

1.答案
package com.sunxiansheng.arithmetic.day14;

import java.util.*;

/**
 * Description: 49. 字母异位词分组
 *
 * @Author sun
 * @Create 2025/1/22 13:30
 * @Version 1.0
 */
public class t49 {

    public static List<List<String>> groupAnagrams(String[] strs) {
        // 存储结果的map
        Map<String, List<String>> map = new HashMap<>();
        // 一次遍历,将每个元素都排序之后作为key放到map中
        for (String str : strs) {
            // 转换为数组
            char[] charArray = str.toCharArray();
            // 排序
            Arrays.sort(charArray);
            // 作为key
            String key = new String(charArray);
            // 如果map中包含了就加入,不包含就创建一个
            if (!map.containsKey(key)) {
                List<String> list = new ArrayList<>();
                list.add(str);
                map.put(key, list);
            } else {
                map.get(key).add(str);
            }
        }
        return new ArrayList<>(map.values());
    }
}
2.思路

一次遍历,将每个元素都排序之后作为key放到map中,如果map中包含了就加入,不包含就创建一个

3.两数之和

1.答案
package com.sunxiansheng.arithmetic.day14;

import java.util.HashMap;
import java.util.Map;

/**
 * Description: 1. 两数之和
 *
 * @Author sun
 * @Create 2025/1/22 13:41
 * @Version 1.0
 */
public class t1 {

    public static int[] twoSum(int[] nums, int target) {
        // key为nums的元素,value为index
        Map<Integer, Integer> map = new HashMap<>();
        // 一次遍历,如果当前元素跟map中的元素可以满足条件,就返回结果
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            } else {
                // 如果不满足条件,就将当前元素加入map
                map.put(nums[i], i);
            }
        }
        // do nothing
        return null;
    }
}
2.思路

一个map,key为nums的元素,value为index,一次遍历,如果当前元素跟map中的元素可以满足条件,就返回结果,如果不满足条件,就将当前元素加入map

4.快乐数

1.答案
package com.sunxiansheng.arithmetic.day14;

import java.util.HashSet;
import java.util.Set;

/**
 * Description: 202. 快乐数
 *
 * @Author sun
 * @Create 2025/1/22 13:50
 * @Version 1.0
 */
public class t202 {

    public static boolean isHappy(int n) {
        // 使用一个set来统计,如果重复出现一次,就是返回false
        Set<Integer> set = new HashSet<>();
        // 只要 1 != n
        while (1 != n) {
            // 计算平方和
            int num = getNum(n);
            // 如果已经包含了,就直接返回false
            if (set.contains(num)) {
                return false;
            }
            // 没有包含再放到set中
            set.add(num);
            // 更新这个n
            n = num;
        }
        return true;
    }

    /**
     * 拿到数字的每个位数的平方和
     *
     * @param n
     * @return
     */
    private static int getNum(int n) {
        int sum = 0;
        while (n > 0) {
            // 拿出第一位
            int num = n % 10;
            sum += (num) * num;
            // 将n去掉一位
            n = n / 10;
        }
        return sum;
    }
}
2.思路

先编写一个方法,拿到数字的每个位数的平方和,然后使用一个set来统计平方和,如果重复出现一次,就是返回false

5.最长连续序列

1.答案
package com.sunxiansheng.arithmetic.day14;

import java.util.HashSet;
import java.util.Set;

/**
 * Description: 128. 最长连续序列
 *
 * @Author sun
 * @Create 2025/1/22 14:16
 * @Version 1.0
 */
public class t128 {

    public static int longestConsecutive(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        // 将数组去重并放到set中
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        // 一趟遍历,只要当前元素的前一个元素不在数组中,那么就说明是一个起点,就可以寻找连续序列的长度
        int max = 1;
        for (Integer num : set) {
            // 统计长度
            int length = 1;
            if (!set.contains(num - 1)) {
                // 当前元素是起点
                int temp = num;
                // 只要包含了下一个元素,长度就加一
                while (set.contains(temp + 1)) {
                    length++;
                    temp++;
                }
            }
            // 更新最大值
            max = Math.max(max, length);
        }
        return max;
    }
}
2.思路

先将数组去重并放到set中,一趟遍历,只要当前元素的前一个元素不在数组中,那么就说明是一个起点,就可以寻找连续序列的长度


http://www.kler.cn/a/526229.html

相关文章:

  • .NET MAUI进行UDP通信(二)
  • 回顾:Maven的环境搭建
  • mybatis(134/134)完结
  • selenium自动化测试框架——面试题整理
  • 【C语言练习题】找出不是两个数组共有的元素
  • ORA-04031 错误
  • Ansys Maxwell:采用对称性的双转子轴向磁通电机
  • 【AI论文】BIOMEDICA:一个源自科学文献的开放生物医学图像-标注档案、数据集及视觉-语言模型
  • 从零开始学习安时积分法(STM32实现程序)
  • Databricks:统一的数据和 AI 平台
  • docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)
  • [C]基础9.深入理解指针(1)
  • 接口使用实例(1)
  • SAP SD学习笔记27 - 贩卖契约(框架协议)3 - 基本契约 - 定期请求(开票计划)
  • pandas基础学习:常用基本函数
  • hdfs:介绍三个脚本
  • jQuery小游戏(一)
  • 向上调整算法(详解)c++
  • 基于STM32的智能停车场管理系统设计
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
  • 玩转大语言模型——使用langchain和Ollama本地部署大语言模型
  • 简易计算器(c++ 实现)
  • UE4.27打包安卓报错
  • 【C语言】如何写一个扫雷游戏
  • 【llm对话系统】大模型源码分析之llama kv cache缓存逻辑
  • 2.1.1 视觉与光学成像