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

【java数据结构】HashMapOJ练习题

【java数据结构】HashMapOJ练习题

  • 一、只出现一次的数字
  • 二 、随机链表的复制
  • 三 、宝石与石头
  • 四、坏键盘打字
  • 五、前K个高频单词

博客最后附有整篇博客的全部代码!!!

一、只出现一次的数字

只出现一次的数字
思路:

  1. 先遍历一遍数组,将所有元素全部存到HashMap集合中
  2. 再遍历一遍数组,获取每个值对应的values值,判断是否等于1

代码:

 public int singleNumber(int[] nums) {
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(hashMap.containsKey(nums[i])){
                hashMap.put(nums[i],hashMap.get(nums[i])+1);
            }else{
                hashMap.put(nums[i],1);
            }
        }
        for(int i=0;i<nums.length;i++){
            if(hashMap.containsKey(nums[i])){
                if(hashMap.get(nums[i])==1){
                    return nums[i];
                }
            }
        }
        return -1;
    }

二 、随机链表的复制

随机链表的复制
思路:

  1. 定义HashMap来存储新老节点的映射关系
  2. 再遍历一遍,然后通过老节点的map.get().next和map.get().random获得新节点的next和random,最后再通过老节点的map.get(cur.next)和map.get(cur.random)映射出应赋值给新节点的next和random的值

map.get(cur).next = map.get(cur.next);
map.get(cur).random =map.get(cur.random);

代码:

        public Node copyRandomList(Node head) {
            Node cur = head;
            HashMap<Node, Node> map = new HashMap<>();
            while (cur != null) {
                Node newNode = new Node(cur.val);
                map.put(cur,newNode);
                cur = cur.next;
            }
            cur=head;
            while (cur != null) {
                map.get(cur).next = map.get(cur.next);
                map.get(cur).random = map.get(cur.random);
                cur=cur.next;
            }
            return map.get(head);
        }

三 、宝石与石头

宝石与石头
思路:

  1. 现将字符串转化为字符数组
  2. 将石头的每个字符存储进HashMap中,然后遍历宝石,如果HashMap中存在宝石,通过map.get()获取values值,进行count++;最后返回count。

代码:

    public int numJewelsInStones(String jewels, String stones) {
        char[] jewelChars = jewels.toCharArray();//宝石
        char[] stonesChars = stones.toCharArray();//石头
        int count = 0;
        HashMap<Character,Integer> map=new HashMap<>();
        for(int i = 0; i < stonesChars.length; i++){
            if(map.containsKey(stonesChars[i])){
                map.put(stonesChars[i],map.get(stonesChars[i])+1);
            }else{
                map.put(stonesChars[i],1);
            }
        }
        for(int i = 0; i<jewelChars.length; i++){
            if(map.containsKey(jewelChars[i])){
                count+=map.get(jewelChars[i]);
            }
        }
        return count;
    }

四、坏键盘打字

坏键盘打字
思路:

  1. 将所有的字符串全部进行大写转化
  2. 将输出的字存储进HashMap的map1集合中
  3. 遍历打印的字,并且只要求输出一遍我们将出现过的字符可以重新放到一个HashMap的map2集合中,判断map1和map2两个如果都不包含则进行打印。

代码:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1= sc.nextLine();
        String str2=sc.nextLine();
        faultyKeyboard(str1,str2);
    }
    public static void faultyKeyboard(String str1,String str2){
        String str3=str1.toUpperCase();
        String str4=str2.toUpperCase();
        char[] str5=str3.toCharArray();
        char[] str6=str4.toCharArray();
        HashMap<Character,Integer> map1=new HashMap<>();
        HashMap<Character,Integer> map2=new HashMap<>();
        for (int i = 0; i < str6.length; i++) {
            if(map1.containsKey(str6[i])){
                map1.put(str6[i],map1.get(str6[i])+1);
            }else{
                map1.put(str6[i],1);
            }
        }
        for(int i=0;i<str5.length;i++){
            if(!map1.containsKey(str5[i])&&!map2.containsKey(str5[i])){
                map2.put(str5[i],1);
                System.out.print(str5[i]);
            }
        }
    }

五、前K个高频单词

前K个高频单词
思路:

  1. 将每个单词存储进HashMap的map集合
  2. 建立小根堆(在未建立好K大小的小根堆的时候,这个时候如果遇到频率相同的单词,需要j建立成大根堆)
  3. 遍历map,先建立好k个大小的小跟堆,堆顶元素小于入堆元素,则插入入堆元素;堆顶元素等于入堆元素,则判断单词大小,小的入堆

代码:

    public List<String> topKFrequent(String[] words, int k) {
        HashMap<String, Integer> map = new HashMap<>();
        for (String word : words) {
            map.put(word, map.getOrDefault(word, 0) + 1);
        }

        //2. 建立小根堆
        PriorityQueue<Map.Entry<String,Integer>> minHeap = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public 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());
            }
        });
        //3.遍历map
        for(Map.Entry<String,Integer> entry : map.entrySet()) {
            if(minHeap.size() < 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 if(top.getValue().compareTo(entry.getValue()) == 0) {
                    if(top.getKey().compareTo(entry.getKey()) > 0) {
                        minHeap.poll();
                        minHeap.offer(entry);
                    }
                }
            }
        }
        ArrayList<String> list = new ArrayList<>();

        for (int i = 0; i < k; i++) {
            Map.Entry<String,Integer> tmp = minHeap.poll();
            list.add(tmp.getKey());
        }
        Collections.reverse(list);
        return list;
    }

此篇博客的全部代码!!!


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

相关文章:

  • 第二十一周:Mask R-CNN
  • 【Linux线程总结】VMA ELF 地址转换 同步和互斥 条件变量 PC模型 循环队列 POSIX信号量 线程池
  • 【vue3组件】【大文件上传】【断点续传】支持文件分块上传,能够在上传过程中暂停、继续上传的组件
  • gradle创建springboot单项目和多模块项目
  • HTB:Support[WriteUP]
  • 数组
  • vim的多文件操作
  • 【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据
  • docker入门——多用户服务器管理(小白)
  • 实战网络安全:渗透测试与防御指南
  • 汽车行业敏捷转型的推动者:ScrumCN的优势与实践
  • GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)
  • 【ES实战】治理项之索引模板相关治理
  • React 前端框架实战教程
  • skynet 源码阅读 -- 「揭秘 Skynet 网络通讯」
  • C语言I/O请使用互斥锁和信号量分别实现5个线程之间的同步
  • java求职学习day17
  • 1.26学习
  • 2025年01月26日Github流行趋势
  • Python3 【正则表达式】:经典示例参考手册
  • 寒假1.25
  • 第04章 15 vtkObjectBase和vtkObject的基本特性及它们在VTK类体系中基础性作用
  • 动手学图神经网络(4):利用图神经网络进行图分类
  • 云岚到家项目100问 v1.0
  • 二叉树高频题目——下——不含树型dp
  • 基于单片机的智能小区门禁系统设计(论文+源码)