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

java简单理解哈希算法

这里需要大家有一些哈希表(散列表的理论基础)
比如冲突怎么处理 key-value是什么意思 有哪些处理冲突的方法 平均查找成功长度和失败长度是什么意思。 详细可以看一下这个数据结构散列表。在java中常用三种结构代表散列:
map,set,数组。应在不同的情况下合理选择。
看题目理解:

题目一:两数之和

给定一个整数数组 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]

分析 :在map中有很多实用的API 例如map.containsKey(某个值)

如果map的key中包含这个值就返回true

每次遍历当前nums中的数据,然后再从map中找target-nums[i]当前的数据如果能从map中找到则返回数组下标

coding:

class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer>mymap=new  HashMap();for(int i=0;i<nums.length;i++){int  mytarget=target-nums[i];if(mymap.containsKey(mytarget)){return new int[]{mymap.get(target-nums[i]),i};}else{
​        mymap.put(nums[i],i);}}return new int[0];}
}

题目二: 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:

输入: strs = [“”]
输出: [[“”]]
示例 3:

输入: strs = [“a”]
输出: [[“a”]]

分析:异位的字母虽然顺序不一样但是内容一样。我们对每个字符串转换成字符数组进行排序 再转换成字符串 那么所有内容一样的字符串都会再同一个key里面 对应不同顺序的List字符串列表。例如"abc"和"bac" 排序后对应同一个key加入map后是abc List是"abc"和"bac".随后再对map进行遍历把遍历的内容放在List<List>result;中。str.toCharArray()//把字符串转换成字符数组、new String(arr)//把字符数组转换成字符串。map.getorDefault(key,其它)//获取某个 key对应的value如果获取不到就默认为其它里面的内容

coding:

class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>>map=new HashMap();List<List<String>>returnlist=new ArrayList<List<String>>();for(int i=0;i<strs.length;i++){String mystr=strs[i];char[]arr1=mystr.toCharArray();Arrays.sort(arr1);String key=new String(arr1);List<String>list=map.getOrDefault(key,new ArrayList<String>());list.add(mystr);map.put(key,list);  }Iterator<Map.Entry<String,List<String>>>  iterator=map.entrySet().iterator();while(iterator.hasNext()){Map.Entry<String,List<String>>entry=iterator.next();returnlist.add(entry.getValue());}return returnlist;}
}

题目三:最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

思路:我们给出一串数字求连续的最长的 6,7,3,4,9,10.15 ,5 ,5 首先肯定是去重。把数据放入到Set中去重。 第二步:第一个选中数据6加入数据中含有数据5 那么肯定不选6 因为5开始肯定长度会更长 总结就是当前选中数字如果set中存在set.contains(当前选中的数字-1);那么就跳过。 只掉选中集合中不存在当前选中的数字-1的数字 例如3就满足 然后继续看是否存在4 ,5 来记录 长度 直到选出最大值

coding:

class Solution {public int longestConsecutive(int[] nums) {Set<Integer>nums_set=new HashSet();int currentlength=0;int longestlength=0;for(int i=0;i<nums.length;i++){​      nums_set.add(nums[i]);}Iterator<Integer>it=nums_set.iterator();while(it.hasNext()){int currentnum=it.next();if(!nums_set.contains(currentnum-1)){​        currentlength=1;while(nums_set.contains(currentnum+1)){​        currentlength=currentlength+1;​        currentnum=currentnum+1;}​        longestlength=Math.max(currentlength,longestlength);​        currentlength=0;}}return longestlength;}}
http://www.lryc.cn/news/464307.html

相关文章:

  • Python生成随机密码脚本
  • 什么是ASC广告?Facebook ASC广告使用技巧
  • idea2024启动Java项目报Error running CloudPlApplication. Command line is too long.
  • xtu oj 不定方程的正整数解
  • python爬虫技术实现酷我付费破解下载
  • 工具:Git分布式版本控制系统
  • python+docxtpl:word文件模版渲染
  • 018_基于python+django荣誉证书管理系统2024_jytq9489
  • Vulkan 开发(三):Vulkan 物理设备
  • Netty无锁化设计之对象池实现
  • 工厂生成中关于WiFi的一些问题
  • Java爬虫:获取商品评论数据的高效工具
  • oracle中的exists 和not exists 用法
  • 自定义导出Excel数据注解实践
  • CSS3 动画相关属性实例大全(一)(@keyframes ,background属性,border 属性)
  • 拦截器或过滤器往本次请求体中添加信息
  • Docker 安装达梦 DM8 数据库实战指南
  • QtCreator14调试Qt5.15出现 Launching Debugger 错误
  • day1:基础了解
  • 【从零开始的LeetCode-算法】3099. 哈沙德数
  • 【Next.js 项目实战系列】02-创建 Issue
  • 浅谈C++的future
  • 期货外盘行情源7个市场CTP推送式服务说明
  • 计算机毕业设计 | SSM 校园线上订餐系统(附源码)
  • 【iOS】使用一个单例通过AFNetworking来实现网络请求
  • 如何从模块内部运行 Pytest
  • oracle数据库---基本查询(单表查询、多表查询、子查询、分页查询、oracle内置函数、行列转换、集合运算)
  • web API基础
  • 【C++】创建TCP服务端
  • 每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56