【LeetCode】349. 两个数组的交集(int[],List<>,Integer[]转换 & List用法)

  今日学习的文章链接和视频链接

leetcode题目地址:349. 两个数组的交集

 代码随想录题解地址:代码随想录

题目简介

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

看到题目的第一想法(可以贴代码)

1. 对数组去重,主要是涉及各种类型转换。

        用 Set集合?Set<String> animals = new HashSet<>(); (放弃)

        用 Stream 的装箱 boxed()方法,List的distinct?

public int[] intersection(int[] nums1, int[] nums2) {
        List<Integer> collect1 = Arrays.stream(nums1).distinct().boxed().collect(Collectors.toList());
        List<Integer> collect2 = Arrays.stream(nums2).distinct().boxed().collect(Collectors.toList());
        ArrayList<Integer> res1 = new ArrayList<Integer>();
        int index = 0;
        for (int i : collect1){
            if (collect2.contains(i)){
                res1.add(i);
            }
        }
        int[] res2 = res1.stream().mapToInt(Integer::intValue).toArray();
        return res2;
    }

实现过程中遇到哪些困难

1. return数组的时候,长度是固定的,需要先用ArrayList存,再类型转换。

看完代码随想录之后的想法

【解题思路】用 Set 写(适用于输入值很大/数据量),用数组写(适用于int[]输入值比较小)。

本题用 set 写。

【想法】

1. 只需要对nums1去重,再遍历nums2判断时候contains(无需对nums2去重)。

2. C++里的set:

        ①set(底层实现:红黑树)

        ②unordered_set(哈希值)        //映射、取值效率最高

        ③multi_set(红黑树)

3. C++里unordered_set转换为int[],可以利用vector。

4. C++里如果用数组int[] 写:先定义一个比较大的哈希数组(以nums1元素值作为其下标,若存在,则设为1),再遍历nums2,如果其哈希值==1,则计入res里,res用unordered_set定义起到去重效果,再转为int[]。

5. java解法:

初始化Set:

Set<Integer> set1 = new HashSet<>();

Set类型转int[]:

resSet.stream().mapToInt(x -> x).toArray();

看完视频自己写的ACC:

        Integer[] arrInteger1 = Arrays.stream(nums1).boxed().toArray(Integer[]::new);
        Set<Integer> s1 = Arrays.stream(arrInteger1).collect(Collectors.toSet());
        Set<Integer> res = new HashSet<Integer>();
        for (int i : nums2){
            if (s1.contains(i)){
                res.add(i);
            }
        }
        return res.stream().mapToInt(x -> x).toArray();

学习时长

9:45 ~ 10:31 解题成功

10:31 ~ 10:52 看视频题解、写博客


今日收获

1. Set初始化:(使用HashSet该类来实现Set接口)

        Set<String> animals = new HashSet<>();

2. int[] 转 List 去重:

        List<Integer> collect = Arrays.stream(arr).distinct().boxed().collect(Collectors.toList());

3. int[] 直接输出:(转String)

        System.out.println("原始数据: " + Arrays.toString(arr));

4. ArrayList<String>与String[] 数组互相转换:

        List<String> a = new ArrayList<String>();

        String[] arr = a.toArray(new String[a.size]);

        List<String> list = Arrays.asList(arr);

5. ArrayList<Integer>如何转换为int[]数组:

        ArrayList<Integer> a = new ArrayList<Integer>();
        int[] array=(int[])a.toArray(new int[size]);        //会报错,因为int[]并不等同于Integer[]

        Integer[] array = list.toArray(new Integer[list.size()]);        //能正确运行

【int数组转List<Integer>集合 以及 List<Integer>集合转int数组】

        int[] intArr = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
 
// int[] -> List<Integer>
List<Integer> integerList = Arrays.stream(intArr).boxed().collect(Collectors.toList());
// List<Integer> -> int[]
int[] intArr = integerList.stream().mapToInt(Integer::intValue).toArray();

【int数组转Integer[] 数组 以及 Integer[] 转int 数组】

// int[] -> Integer[]
Integer[] integerArr = Arrays.stream(intArr).boxed().toArray(Integer[]::new);
// Integer[] -> int[]
intArr  = Arrays.stream(integerArr).mapToInt(Integer::valueOf).toArray();

【Integer数组转List<Integer>集合 以及 List<Integer> 集合转Integer数组】

// Integer[] -> List<Integer>
integerList = Arrays.asList(integerArr);
// List<Integer> -> Integer[]
Integer[]  integerArr = integerList.toArray(new Integer[integerList.size()]);

【另一篇文章】

        int []arr = {1,2,3,4,5,6};
        // int[] 转List  boxed: 装箱:将基本类型转成包装类
        List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
        System.out.println(list);

        // int[] 转 integer[]
        Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);

        //List<> 转  Integer[]
        Integer[] arr3 = list.toArray(new Integer[0]);

        // List<> 转 int[]
        int[] arr4 = list.stream().mapToInt(Integer::intValue).toArray();

        //Integer[] 转 int[]
        int[]arr5 = Arrays.stream(arr3).mapToInt(Integer::intValue).toArray();

        // Integer[] 转 List<Integer>
        List<Integer> list2 = Arrays.asList(arr2);

6. 关于输出:

输出 int[]:System.out.println("Stream去重: " + Arrays.toString(arr));

输出List:System.out.println("Stream去重: " + self_list);

7. 【几种涉及的java类型】Set(HashSet),Lits(ArrayList),List<Integer>,int[],Integer[]

7. List 的常用方法:

  • add() - 将元素添加到列表

  • addAll() - 将一个列表的所有元素添加到另一个

  • get() - 有助于从列表中随机访问元素

  • iterator() - 返回迭代器对象,该对象可用于顺序访问列表的元素

  • set() - 更改列表的元素

  • remove() - 从列表中删除一个元素

  • removeAll() - 从列表中删除所有元素

  • clear() - 从列表中删除所有元素(比removeAll()效率更高)

  • size() - 返回列表的长度

  • toArray() - 将列表转换为数组

  • contains() -  如果列表包含指定的元素,则返回true

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值