Map相关习题 138复制带随机指针的链表 旧键盘(20) - 牛客

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map相关习题 138复制带随机指针的链表 旧键盘(20) - 牛客相关的知识,希望对你有一定的参考价值。

目录

138、复制带随机指针的链表 - 力扣 

旧键盘(20) - 牛客 



 

思路:遍历原链表,构造新链表的节点,存储在Map中。原链表与新链表一一对应,原1.next 和 新1.next 一一对应;原1.random 和 新1.random 一一对应;原1.next = 原3 => 新1.next = 新3

class Solution 
    public Node copyRandomList(Node head) 
        // 边界
        if (head == null) 
            return null;
        
        //遍历原链表,构造新链表的节点,存储在Map中
        //Map<原链表节点,新链表节点>
        //原1 => 新1
        Map<Node,Node> nodeMap = new HashMap<>();
        for (Node x = head;x != null;x = x.next) 
            //构造新链表节点
            Node node = new Node(x.val);
            nodeMap.put(x,node);
        
        //对新链表进行连接操作
        //原1.next 和 新1.next 一一对应
        //原1.random 和 新1.random 一一对应
        //原1.next = 原3 => 新1.next = 新3(这个地址就可以根据原3来取得)
        for (Node x = head;x != null;x = x.next) 
            //新链表的random和next和原链表一一对应
            //对于Map来说,Key都是原链表的节点
            //原1.next= 原3
            nodeMap.get(x).next = nodeMap.get(x.next);
            //原1.random = 原5
            nodeMap.get(x).random = nodeMap.get(x.random);
        
        //返回原链表的头节点,就是原链表的head的映射
        return nodeMap.get(head);
    

旧键盘(20) - 牛客 

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

输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括大、小写)、数字0-9、以及下划线“_”(代表空格)组成。题目保证2个字符串均非空。按照发现顺序,在一行中输出坏掉的键。其中英文字母只输出大写,每个坏键只输出一次。题目保证至少有1个坏键。

输入:7_This_is_a_test<br/>_hs_s_a_es     输出:7TI

思路:所谓坏键就是实际不存在但期望中存在的键,先将字符串全部转为大写的,再遍历实际中存储的字符串保存在Set中,因为Set集合不包含重复元素;然后遍历期望输出的字符串使用Set集合过滤出已经出现的坏键。

import java.util.*;

/**
 * 坏键盘
 * @author wyc
 * @date 2022/03/16 10:34
 **/
public class Main 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        //期望输入的
        String exceptedStr = null;
        //实际输入的
        String actualStr = null;
        while (scanner.hasNext()) 
            exceptedStr = scanner.next();
            actualStr = scanner.next();
        
        //输出全是大写的,将输入的字符串转为大写处理 toUpperCase
        exceptedStr = exceptedStr.toUpperCase();
        actualStr = actualStr.toUpperCase();
        //遍历实际存储的字符串,使用Set集合存储不重复的字符
        Set<Character> actualSet = new HashSet<>();
        for (int i = 0; i < actualStr.length(); i++) 
            actualSet.add(actualStr.charAt(i));
        
        //拿着实际输入的Set集合来遍历期望输入的字符串
        //坏键就是期望有,但实际存储没有
        //再用一个Set来去重,去的是实际字符串中重复存储的元素
        Set<Character> exceptedSet = new HashSet<>();
        for (int i = 0; i < exceptedStr.length(); i++) 
            char c = exceptedStr.charAt(i);
            //坏键就是期望有,实际没有
            if (!actualSet.contains(c)) 
                //去重
                if (exceptedSet.add(c)) 
                    //c确实是期望有,但实际中没有,而且第一次出现的
                    System.out.print(c);
                
            
        
        System.out.println();
    


本小节完^_^

以上是关于Map相关习题 138复制带随机指针的链表 旧键盘(20) - 牛客的主要内容,如果未能解决你的问题,请参考以下文章

Map和Set习题

LeetCode 138. 复制带随机指针的链表(Map,复制链表,Java)

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

LeetCode(算法)- 138. 复制带随机指针的链表

题目地址(138. 复制带随机指针的链表)

题目地址(138. 复制带随机指针的链表)