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的应用的主要内容,如果未能解决你的问题,请参考以下文章
Java 数据结构 & 算法宁可累死自己, 也要卷死别人 7 单向链表