【LeetCode】Map与Set相关笔试题

本文介绍了五个使用Map与Set解决的LeetCode笔试题目,包括找到只出现一次的数字、复制带随机指针的链表、宝石与石头问题、处理坏键盘打字问题以及找出前K个高频单词。解题过程中强调了Map和Set在存储、比较和排序上的关键作用,如使用TreeMap配合自定义比较器、利用toCharArray转换字符串以及Character.toUpperCase进行大小写转换等。
摘要由CSDN通过智能技术生成

1、只出现一次的数字

只出现一次的数字链接题目描述
解题思路及代码

/**
     * 思路:
     * 方法一:
     * key-value模型,数字是key,出现次数是val
     * 将数组放入map中
     * 用map找到val为1的key
     *
     * 方法二:
     * 两个相同的数异或后结果为0
     * 任意数与0异或还是自己
     * 所有数异或结果就是只出现一次的数
     */
public class SingleNumber {
   
     public int singleNumber1(int[] nums) {
   
        Map<Integer,Integer> map = new TreeMap<>();
        for (int n : nums){
   
            int count = map.getOrDefault(n,0);
            map.put(n,count+1);
        }
        for (Map.Entry<Integer,Integer> e : map.entrySet()){
   
            int n = e.getKey();
            int c = e.getValue();
            if (c == 1){
   
                return n;
            }
        }
        return -1;
    }

    public int singleNumber2(int[] nums) {
   
        int r = 0;
        for (int n : nums){
   
            r = r ^ n;
        }
        return r;
    }
}

总结:

  1. 任意数异或自己本身,结果为0;
  2. 任意数异或0,结果不变;

2、复制带随机指针的链表

复制带随机指针的链表链接

题目描述
举例
解题思路及代码

 /**
     * 思路:
     * 方法一:
     * 按照链表的方式复制
     * 难点:(Random)指向找到新链表的节点(Random)指向
     * 1.将旧链表结点复制一份
     * 2.将新旧链表连起来
     * 3.根据旧链表的Random找新链表的Random
     * 4.结束后将新旧链表分开
     *
     * 方法二:
     * 通过Map保存新旧链表的映射关系
     * 旧链表中的结点作为key,新链表中的结点作为value;
     * 新链表node,旧链表cur
     * node.random = map.get(cur.random)
     * 解释:cur.random是key,get(cur.random)是key对应的value。
     */
public class CopyList {
   
   public Node copyRandomList(Node head){
   
        Node cur = head;
        while (cur != null){
   
            Node node = new Node();
            node.val = cur.val;

            node.next = cur.next;
            cur.next = node;
            cur = node.next;
        }
        cur = head;
        //复制random
        while (cur != null){
   
            if (cur.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值