欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

Java数据结构之Map与Set专篇讲解

时间:2022-10-29 11:25:29|栏目:JAVA代码|点击:

①只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

输入: [2,2,1]
输出: 1

首相我们可能会想到用位运算直接解决,但我们也可以用hash色条解决。

public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }
 

hashset也已轻松解决这个问题,将整个数组中的元素放入set,因为只出现一次的数字只有一次,所以我们将多次出现相同的数字移除

public int singleNumber(int[] nums){
 
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++){
            if (set.contains(nums[i])){
                set.remove(nums[i]);
            }else {
                set.add(nums[i]);
            }
        }
        for (int i = 0; i < nums.length; i++){
            if (set.contains(nums[i])){
                return nums[i];
            }
        }
        return -1;
 
    }

②宝石与石头

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

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

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

这道题和第一道题一样,这里是统计不同的个数。因为要区分大小写,所以我们将小写转大写,不影响我们做出判断

 public int numJewelsInStons(String jewels,String stons){
        stons.toUpperCase(Locale.ROOT).toCharArray();
 
        HashSet<Character> set = new HashSet<>();
 
        for (int i = 0; i < jewels.length(); i++){
            set.add(jewels.charAt(i));
        }
 
        int count = 0;
        for (char ch:stons.toCharArray()) {
            if(set.contains(ch)){
                count++;
            }
        }
        return count;
    }

③坏键盘打字

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

输入

7_This_is_a_test
_hs_s_a_es

输出

7TI

这道题我们要分两个set,一个setActual记录真实打出的字母,一个setBroken统计坏掉的字母,判断条件是符合的字母既不是包含setActual中已经存在的,也不是setActual与setBroken相同的字母。主要是同时对比setActual与setBroken。

public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str1 = scan.nextLine();
        String str2 = scan.nextLine();
 
        HashSet<Character> setActual = new HashSet<>();
        for (char ch:str2.toUpperCase(Locale.ROOT).toCharArray()) {
            setActual.add(ch);
        }
        HashSet<Character> setBroken = new HashSet<>();
        for (char ch: str1.toUpperCase(Locale.ROOT).toCharArray()) {
            if(!setActual.contains(ch) && !setBroken.contains(ch)){
                setBroken.add(ch);
                System.out.print(ch);;
            }
        }
    }

④复制带随机指针的链表

给你一个长度为 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]]

class Node {
    int val;
    Node next;
    Node random;
 
    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
 
public Node copyRandomList(Node head){
        if (head == null) return null;
        HashMap<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);
 
 
    }

上一篇:Java利用Dijkstra和Floyd分别求取图的最短路径

栏    目:JAVA代码

下一篇:SpringBoot结合Mybatis实现创建数据库表的方法

本文标题:Java数据结构之Map与Set专篇讲解

本文地址:http://www.codeinn.net/misctech/217655.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有