【Java数据结构】——五道算法题让你灵活运用Map和Set

目录

一.只出现一次的数字

二.宝石与石头

三.旧键盘

四.给定一个数组,统计每个元素出现的次数

五.前K个高频单词


一.只出现一次的数字

136. 只出现一次的数字 - 力扣(LeetCode)

算法原理:我们将nums中每个元素都存入到set中去,但是存入是有条件的,如果不存在就加进去,如果已经存在了那么我们就就将那个值移除。然后循环结束后我们看到只剩下一个元素,然后我们再次遍历这个数组,因为set中就包含了一个元素,那么如果遍历后那个数存在在set中,那么就返回那个值,否则返回-1;

class Solution {public int singleNumber(int[] nums) {HashSet<Integer> set=new HashSet<>();for(int x:nums){if(!set.contains(x)){set.add(x);//不包含就增加}else{set.remove(x);//包含就删除}}//集合中只有一个元素for(int x:nums){if(set.contains(x)){return x;}//然后遍历,如果包含就返回x}return -1;//     TreeSet<Integer> set=new TreeSet<>();//     for(int x:nums){//         if(!set.contains(x)){//             set.add(x);//不包含就增加//         }else{//             set.remove(x);//包含就删除//         }//     }//     //集合中只有一个元素//     for(int x:nums){//         if(set.contains(x)){//             return x;//         }//     }//     return -1;// }
}

二.宝石与石头

771. 宝石与石头 - 力扣(LeetCode)

算法原理:我们设定一个HashSet,然后先将宝石中的字符串各个字符都存入到set中去,然后继续遍历石头字符串,如果石头中的字符串在set中,那么就计数++

class Solution {public int numJewelsInStones(String jewels, String stones) {HashSet<Character>set=new HashSet<>();//先让宝石里面的各个字符都放进hashset中for(char x:jewels.toCharArray()){set.add(x);}//ToCharArray( )的用法,将字符串对象中的字符转换为一个字符数组。int sum=0;//然后遍历石头里的各个字符,判断是否包含在set里面,如果包含就sum++for(char ch:stones.toCharArray()){if(set.contains(ch)){sum++;}}return sum;}
}

toCharArray是将字符串转为字符数组。


三.旧键盘

旧键盘 (20)__牛客网 (nowcoder.com)

题目解析:

  • 我们输入第一行 (键盘没坏) ——7_This_is_a_test
  • 输入第二行   (键盘坏了)—— _hs_s_a_es

我们看到坏掉的字符有  7T i i t t 但是我们本题说明了,只输出大写,所以在第一行输入的时候,t和T都是一样的。而且题目也限制了,每个坏键只输出一次。

俩个条件:1.每个坏键只输出一次   2.只输出大写(说明在输入第一行中,t和T都是一样的)

算法原理:

我们用str1记录第一行,用str2记录第二行。我们先将str2遍历一遍,将str2中每个元素都存入到set中,然后遍历str2字符串,如果遇到不包含的元素,我们就输出,但是如果后面遇到同样 比如 上面的字符串7_This_is_a_test,中i出现了俩次,题目规定坏键只能输出一次。所以这时候我们就再定义一个set2,俩个条件,那个元素既不包含str1,也不包含在str2中,我们才输出,并且让那个值加到set2中。

所以我们 看到俩个条件,每个坏键只能输出一次,所以当前面已经出现的字符,我们就不能在输出了,此时就需要在创建一个set2,还有一个条件就是 不区分大小写,T和t都是同一个字母,所以哪个已经输出了,那么t就不能输出了,所以我们直接将俩个字符串的每个字符都弄成大写。

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str1 = in.nextLine();String str2 = in.nextLine();func(str1,str2);}}private static void func(String str1,String str2){HashSet<Character> set1=new HashSet<>();for(char ch: str2.toUpperCase().toCharArray()){set1.add(ch);}//先将字符串2放入set中//然后再遍历字符串1,如果字符串1中有元素不包含再字符串1和字符串2中,那么就输出,并且将该字符加进set2中HashSet<Character> set2=new HashSet<>();//先转大写,然后转字符数组for(char ch:str1.toUpperCase().toCharArray()){if(!set1.contains(ch) && !set2.contains(ch)){System.out.print(ch);set2.add(ch);}}}
}

我们需要先将字符串的每个元素转成大写,然后转成字符数组。


四.给定一个数组,统计每个元素出现的次数

解题思路:

map中有个方法是get(),获取key得到value,我们依次遍历array数组,如果我们获取到key,如果返回的value值是空,我们就put假如到map中,并计入key和value=1,如果value值不等于空,那么我们就先获取当前key的value值,然后让value值加1.

//给定一个数组,然后输出每个元素出现的个数int[] array={1,2,3,3,1,4};HashMap<Integer,Integer>map=new HashMap<>();for(Integer x:array){if(map.get(x)==null){//如果x出现个数是null,那么我们就将value设置1map.put(x,1);}else{//如果3出现了1次之后,我们要先获取3对应的个数,然后+1int value=map.get(x);map.put(x,value+1);}}for (Map.Entry<Integer,Integer>entry: map.entrySet()){System.out.println("key: "+entry.getKey()+"  value: "+entry.getValue());}

 然后Map中有个Entry<K,V>,调用entrySet()就能得到所有的key-value映射关系。


五.前K个高频单词

692. 前K个高频单词 - 力扣(LeetCode)

算法原理:

1.首先我们要记录每个字符串出现的次数(请看第4题)

2.遍历好统计的Map,把每组数据存储到小根堆中

如果频率相同,按字母比较(从小到大)——大根堆,频率不同,按频率高到低(从大到小)——小根堆。

//遍历好统计的Map,把每组数据存储到小根堆中PriorityQueue<Map.Entry<String,Integer>>minHeap =new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {//放元素的时候 如果频率相同 我们转变为大根堆-》按照单词的字典序if(o1.getValue().compareTo(o2.getValue()) == 0) {return o2.getKey().compareTo(o1.getKey());}//放元素的时候 如果频率不同 我们转变为小根堆-》按照频率大小排序return o1.getValue().compareTo(o2.getValue());}});//小根堆 o1在前o2在后  大根堆o1在后o2在前

因为我们要分情况 建大堆 还是建小堆。


然后遍历Map,利用Map的entrySet(),找前k个出现单词数最多的,你要找频率最大单词,如果堆的元素小于k,那么我们就直接将Map的键值对都offer进去,如果大于k,我们就要先获取堆顶元素,然后判断堆顶元素的value值是不是小于当前的entry的value,如果小于,那么就将堆顶删除,然后让offer当前的元素,如果大于,就继续循环,如果堆顶的value等于entry的value(说明出现的频率是相等的)那么,我们就要比较当前堆顶的key值和entry的key值是大于还是小于,如果大于,那么就要将当前的删除,然后offer当前entry值。


class Solution {public List<String> topKFrequent(String[] words, int k) {//先统计每个单词出现个数Map<String,Integer>map=new HashMap<>();for (String word:words) {if(map.get(word)==null){map.put(word,1);}else{int val=map.get(word);map.put(word,val+1);}}//遍历好统计的Map,把每组数据存储到小根堆中PriorityQueue<Map.Entry<String,Integer>>minHeap =new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {@Overridepublic int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {//放元素的时候 如果频率相同 我们转变为大根堆-》按照单词的字典序if(o1.getValue().compareTo(o2.getValue()) == 0) {return o2.getKey().compareTo(o1.getKey());//大根堆}return o1.getValue().compareTo(o2.getValue());//小根堆}//小根堆 o1在前o2在后  大根堆o1在后o2在前});for (Map.Entry<String,Integer> entry:map.entrySet()) {if(minHeap.size()<k){//map里面的元素小于k,那么直接进堆就行了minHeap.offer(entry);}else {//你要找最大的频率的单词Map.Entry<String,Integer>top=minHeap.peek();//如果栈顶的元素个数小于现在的元素,那么就让栈顶删除,将他放入栈中//小根堆堆顶元素是最小的,如果比堆顶元素还小,那么就放入if(top.getValue().compareTo(entry.getValue())<0){minHeap.poll();minHeap.offer(entry);}else{//def->2  abc->2if(top.getValue().compareTo(entry.getValue())==0){//频率相同,按字母顺序if(top.getKey().compareTo(entry.getKey())>0){//getKey()得到key值minHeap.poll();minHeap.offer(entry);}}}}}//2 3 4List<String>ret=new ArrayList<>();for (int i = 0; i <k ; i++) {Map.Entry<String,Integer>top=minHeap.poll();ret.add(top.getKey());}//拿到的是 2 3 4,然后需要逆置Collections.reverse(ret);//Collections是逆置return ret;}
}

好好的生活,来又去,去又来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASUS华硕天选5笔记本电脑FX607JV原装出厂Win11系统下载

ASUS TUF Gaming F16 FX607JV天选五原厂Windows11系统 适用型号&#xff1a; FX607JU、FX607JI、FX607JV、 FX607JIR、FX607JVR、FX607JUR 下载链接&#xff1a;https://pan.baidu.com/s/1l963wqxT0q1Idr98ACzynQ?pwd0d46 提取码&#xff1a;0d46 原厂系统自带所有驱动、…

python自动化学习--3.8python操作EXCEL文件python日志收集处理

1、Excel文件处理 安装 openpxl 第三方库 openpxl 模块三大组件: 1、工作簿 &#xff08;包含多个sheet工作表&#xff09; 2、工作表 &#xff08;某个数据包含在某个工作表&#xff09; 3、单元格 1、创建excel工作簿 import openpyxl"""Excel表格的创建…

GotoXy控制台光标的位置更新

光标控制解释 控制台的光标更新方法, 用于控制数据输出位置 void gotoXY(int x, int y)//新函数&#xff1a;更新光标 {COORD c;c.X x;c.Y y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }代码解释 这段代码定义了一个名为 gotoXY 的函数&#xff0c;…

【Spring Boot】实现全局异常处理

1.定义基础异常接口类 /*** description: 服务接口类* author: MrVK* date: 2021/4/19 21:39*/ public interface BaseErrorInfoInterface {/*** 错误码* return*/String getResultCode();/*** 错误描述* return*/String getResultMsg(); } 2.定义错误处理枚举类 /*** desc…

小伙伴询问AI该怎么学习?本人的一点总结,以思维导图呈现

如有需要思维导图的在后台请留邮箱&#xff0c;相关知识结构目录 部分导图

nn.Linear() 使用提醒

原本以为它是和nn.Conv2d()一样&#xff0c;就看第二个维度的数值&#xff0c;今天才知道&#xff0c;它是只看最后一个维度的数值&#xff01;&#xff01;&#xff01; 例子1 Descripttion: Result: Author: Philo Date: 2024-02-27 14:33:50 LastEditors: Philo LastEditT…

如何使用“Ubuntu 20.04桌面版,安装MariaDB数据库“?win10系统?

1、更新软件包 sudo apt update 2、 安装MariaDB服务器和客户端 sudo apt install mariadb-server mariadb-client 3、 查看MeriaDB是否运行 service mysql status :q"退回命令行状态 4、 设置MariaDB root用户的密码 sudo mysql_secure_installation 5、 MariaD…

斐波那契数列模型----三步问题

面试题 08.01. 三步问题 - 力扣&#xff08;LeetCode&#xff09; 1、状态表示&#xff1a; 题目要求&#xff1a;上到n阶台阶&#xff0c;有多少种方法。那么n逐渐简化&#xff0c;上1阶台阶有多少种方法&#xff1b;上2阶台阶有多少种方法……直到上n阶台阶有多少种方法。 …

代码随想录第45天|● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

文章目录 ● 70. 爬楼梯 &#xff08;进阶&#xff09;思路&#xff1a;- 排列 先value后weight代码&#xff1a; ● 322. 零钱兑换思路&#xff1a;代码 ● 279.完全平方数思路&#xff1a;代码 ● 70. 爬楼梯 &#xff08;进阶&#xff09; 思路&#xff1a;- 排列 先value后…

如何提升计算机性能

04 穿越功耗墙&#xff0c;我们该从哪些方面提升“性能”&#xff1f; 上一讲&#xff0c;在讲 CPU 的性能时&#xff0c;我们提到了这样一个公式&#xff1a; 程序的 CPU 执行时间 指令数CPIClock Cycle Time 这么来看&#xff0c;如果要提升计算机的性能&#xff0c;我们可以…

基于ZYNQ的PCIE高速数据采集卡的设计(一)

作为信息处理的第一步&#xff0c;数据采集的作用越来越重要。目前&#xff0c;数据采集已经在航 空、民用、军事、医疗等领域得到广泛应用。随着相关技术的不断发展&#xff0c;信号频率越 来高&#xff0c;带宽越来越大&#xff0c;使得数据采集技术逐渐向高速大数据的方向…

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞&#xff0c;上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求&#xff0c;很多小伙伴就寻思用Linux系统搭建占用会不会小一点&#xff1f;有计算机基础的小伙伴都知道Linux系统和Windows系统相比&#xff0c;…

【Linux】实时查看服务器信息

查看服务器CPU使用率 使用命令mpstat 1。这里的1表示每隔1秒更新一次CPU使用率。如果系统未安装mpstat&#xff0c;可以通过安装sysstat包来获取它。 在基于Debian的系统&#xff08;如Ubuntu&#xff09;上&#xff0c;使用命令&#xff1a; sudo apt-get update sudo apt-…

考研复试类比社团招新,无所谓“公平”,导师选谁都是他的权力

这篇文章是抖音和b站上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音和b站账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。 我考研一战的时候计算机考…

【详识JAVA语言】面向对象程序三大特性之一:封装

封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说 就是套壳屏蔽细节。 比如&#xff1a;对于电脑这样一个复杂的设备&#xff0c;提供给用户的就只是&#xff1a;开关机、通…

管理系统提升:列表页构成要素,拒绝千篇一律

大家伙&#xff0c;我是大千UI工场&#xff0c;专注UI知识案例分享和接单&#xff0c;本期带来B端系统列表页的分享&#xff0c;欢迎大家关注、互动交流。 一、什么是列表页 管理系统列表页是指管理系统中用于展示和管理数据的页面&#xff0c;通常以表格或列表的形式呈现。列…

23端口登录的Telnet命令+传输协议FTP命令

一、23端口登录的Telnet命令 Telnet是传输控制协议/互联网协议&#xff08;TCP/IP&#xff09;网络&#xff08;如Internet&#xff09;的登录和仿真程序&#xff0c;主要用于Internet会话。基本功能是允许用户登录进入远程主机程序。 常用的Telnet命令 Telnet命令的格式为&…

有人吐槽:可视化大屏面向领导的设计,真相是这样吗?

某些老铁的态度很极端&#xff0c;看到可视化大屏页面就一口断定&#xff0c;除了讨好领导之外&#xff0c;屁用没有。真相是这样吗&#xff1f;贝格前端工场尝试给老铁们分析下。 一、可视化大屏确实要面向领导&#xff0c;但不是讨好领导 可视化大屏的设计需要考虑领导和管理…

整理的一些脑模板及节点的名称

整理的一些脑模板及节点的名称 前言模板简介AAL90模板HOA112 模板 前言 自己看论文找的&#xff0c;因为有些数据集网站的确有点难找到模板的名称等等。所以主要是看一些论文&#xff0c;因为有文献&#xff0c;所以更有保障一些。当然也有一些在数据网站上比较容易找到所以一…

小兴教你做平衡小车-stm32程序开发(按键扫描)

文章目录 1 单片机最小系统板按键原理图介绍2 库函数程序设计3 寄存器程序设计4 效果展示 1 单片机最小系统板按键原理图介绍 从图中看出单片机的PB12引脚接到了按键上。 根据按键的原理图&#xff0c;可以分析得到&#xff0c;如果不按下按键的时候&#xff0c;引脚输入的是…