leetocdeMap&Set的应用

Posted 芋泥*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetocdeMap&Set的应用相关的知识,希望对你有一定的参考价值。

1. 复制带随机指针的链表

OJ:复制带随机指针的链表

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

示例:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]

输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

解题思路

使用一个Map接口,用来保存原节点与新节点。
(1)第一次遍历原链表,将原链表节点与新节点保存到map中
(2)第二次遍历原链表,将原链表中节点对应的新节点node与node.next和node.random连接

解释:map.get(node)这个是node对应创建的新节点
根据原节点找到新节点map.get(node).next=map.get(node.next)
map.get(node).next是即将要连接的位置,map.get(node.next)是下了一个节点的位置
random同理。

    public Node copyRandomList(Node head) 
        Map<Node,Node> map = new HashMap<>();
        Node cur = head;
        while (cur != null)
            Node node = new Node(cur.val);
            map.put(cur,node);
            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);
    

2. 宝石与石头

OJ:宝石与石头

 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。

字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。

示例 1:

输入:jewels = "aA", stones = "aAAbbbb"

输出:3

示例 2:

输入:jewels = "z", stones = "ZZ"

输出:0

解题思路

Set具有去重的作用

(1)将jewels中的字符保存在set中,
(2)int num=0;用于保存宝石的数量
(3)遍历stones,

        char c=stones.charAt(i),取出一个字符
        set.contains(c)如果当前字符是宝石,num++
(4)遍历完后返回num

    public int numJewelsInStones(String jewels, String stones) 
        Set<Character> set = new HashSet<>();
        for(int i = 0;i < jewels.length();i ++)
            char c = jewels.charAt(i);
            set.add(c);
        
        int num = 0;
        for (int i = 0; i < stones.length(); i++) 
            char c = stones.charAt(i);
            if(set.contains(c))
                num++;
            
        
        return num;
    

3. 多数元素

OJ:多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 [n/2] 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入:nums = [3,2,3]

输出:3

示例 2:

输入:nums = [2,2,1,1,1,2,2]

输出:2

接替思路

(1)使用Map接口,其中key保存数字,value保存出现次数
(2)遍历nums数组,将数组中每个数以及出现次数保存到map中
(3)map.put(nums[i],map.getdefault(nums[i],0)+1);map.getdefault(nums[i],0)+1):查找nums[i]对应的value,不存在返回默认值0,存在返回原来存在的值,然后再加1;就变成了对应数字出现次数+1这个功效了

(4)遍历map(注意map不能直接使用for-each遍历,需要使用entry)判断哪个数字的出现次数大于 n / 2,将这个数字返回。

    public int majorityElement(int[] nums) 
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) 
            map.put(nums[i],map.getOrDefault(nums[i],0) + 1);
        
        for (Map.Entry<Integer,Integer> i : map.entrySet()
        )
            if(i.getValue() > nums.length / 2)
                return i.getKey();
            
        
        return -1;
    

4. 旧键盘 (20)

链接:旧键盘 (20)__牛客网
来源:牛客网

旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入描述:

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、 以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。

输出描述:

按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写每个坏键只输出一次。题目保证至少有1个坏键。

示例1

输入

7_This_is_a_test<br/>_hs_s_a_es

输出

7TI

解题思路

这题和前面宝石与石头的题类似,
(1)先将应该被输入与实际输入的两个字符串中的字符全部转为大写字母
(2)遍历实际输入的字符串,将每个不重复字符保存到set中
(3)再创建一个set1,用于保存坏掉的键(注意hashSet无序,linkedHashSet有序
再遍历应该被输入的字符串查看set中是否包含这个字符不包含则这个字符是坏掉的键,将这个字符保存到set1中

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 处理多个 case
            String s1 = in.nextLine().toUpperCase();
            String s2 = in.nextLine().toUpperCase();
            // Set<Character> set = new HashDrbg
            Set<Character> set = new HashSet<>();
            for (int i = 0; i < s2.length(); i ++) 
                // Char c = s2.charAt(i);
                    set.add(s2.charAt(i));
            
            // hashset无序,linkedhashset有序
            Set<Character> set1 = new LinkedHashSet<>();
            for (int i = 0; i < s1.length(); i ++) 
                // Char c = s1.charAt(i);
                if (!set.contains(s1.charAt(i))) 
                    set1.add(s1.charAt(i));
                
            
            // 输出
            for(char c : set1)
                System.out.print(c);
            
            System.out.println();
        
    

PARSEC測试集的应用领域和working set的大小

參考:PARSEC vs. SPLASH-2: A Quantitative Comparison of Two
Multithreaded Benchmark Suites on Chip-Multiprocessors

The PARSEC Benchmark Suite: Characterization and Architectural Implications

以下展示的是parsec測试集中应用程序的使用领域:
技术分享


以下展示的是parsec測试集中应用程序的大小:
技术分享





以上是关于leetocdeMap&Set的应用的主要内容,如果未能解决你的问题,请参考以下文章

List&Map&Set的操作和遍历

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 7 单向链表

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 7 单向链表

Java深入理解及巩固 Map & Set 集合

Scala 系列—— 常用集合类型之 List & Set

HDU 4585 Shaolin (set的应用)