int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」

文章目录

  • [1、int[ ] 转 Integer[ ]:](#1、int[ ] 转 Integer[ ]:)
  • 2、两道leetcode题遇到的场景:
    • [2.1、int[ ] 转 List<Integer> :](#2.1、int[ ] 转 List<Integer> :)
    • [2.2、int[ ] 转 Map:](#2.2、int[ ] 转 Map:)

1、int[ ] 转 Integer[ ]:

java 复制代码
public static void main(String[] args) {
    int[] nums = {1, 2, 3};    
    Integer[] array = Arrays.stream(nums).boxed().toArray(Integer[]::new);    
    System.out.println(Arrays.toString(array));
}

输出:

html 复制代码
// [1, 2, 3]

2、两道leetcode题遇到的场景:

众所周知,将普通数组转为List集合,可以通过JDK提供的诸多方法来减轻我们的编码负担,所以接下来小名借用两个leetcode题中的场景来分享下数组转集合的使用方法:

2.1、int[ ] 转 List<Integer> :

java 复制代码
List<Integer> ints = Arrays.stream(nums)
.boxed()
.collect(Collectors.toList());

看到开头的「int[ ]转Integer[ ]」可能有的小伙伴并不知道什么情况会用。当然平日开发我们断然不会这样为难自己,一般入参和出参都会很自然的定义为数据类型为包装类的Integer的数组(Integer[])。

但是作为码农的小名刷题时,发现一个有意思的现象:当你想对一个int[ ]数组进行降序排序(注意这里不是给List降序排序)时,「Arrays.sort()」方法只为非包装类的int提供了 升序排序 ,并不提供对其 降序排序 的方法

题目地址: https://leetcode.cn/problems/third-maximum-number/

  1. 第三大的数
    给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
    示例 1:
    输入:[3, 2, 1]
    输出:1
    解释:第三大的数是 1 。

示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/third-maximum-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Coding:

java 复制代码
        public int thirdMax(int[] nums) {
            // 将int[]降序排序、去重并转为List<Integer>
            List<Integer> ints = Arrays.stream(nums)
            .boxed()
            .distinct()
            .sorted(Collections.reverseOrder())
            .collect(Collectors.toList());
            // 获得最大的数字
            int num = ints.get(0);
            // 初始化计数器
            int count = 1;
            for (int i = 1; i < ints.size(); i++) {
                // 数组长度小于3时,返回数组中第一个即最大的数字
                if (ints.size() < 3) {
                    return ints.get(0);
                }
                int intnum = ints.get(i);
                // 返回第三大的数字
                if (intnum < num && count <= 2) {
                    num = intnum;
                    count++;
                }
            }
            return -1;
        }

2.2、int[ ] 转 Map:

java 复制代码
Map<Integer,Long> map= Arrays.stream(nums)
.boxed()
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

通过上面「int[ ]转List」 可能有使用过JDK8-lambda表达式 的小伙伴会想看下如果将int[ ]数组转为 Map 这种数据结构后的样子,毕竟Map有很多好用的场景,例如下面这道题的应用。

题目地址: https://leetcode.cn/problems/majority-element/

  1. 多数元素
    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
    你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:
输入:nums = [3,2,3]
输出:3

示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/majority-element
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Coding:

java 复制代码
    public int majorityElement(int[] nums) {
        // 获取 n/2 的数组长度
        int size = nums.length>>1;
        // 将 数字-出现次数 以Map的Key-Value的结构分组
        Map<Integer,Long> map= Arrays.stream(nums)
        .boxed()
        .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
        // 遍历数字,获取数字出现次数
        for (Map.Entry<Integer,Long> entry : map.entrySet()) {
            // 返回其中的多数元素
            if (entry.getValue() > size) {
                return entry.getKey();
            }
        }
        return -1;
    }
相关推荐
元亓亓亓1 小时前
Leet热题100--208. 实现 Trie (前缀树)--中等
java·开发语言
拿破轮1 小时前
不小心在idea中点了add 到版本控制 怎么样恢复?
java·ide·intellij-idea
墨染点香2 小时前
LeetCode 刷题【144. 二叉树的前序遍历】
数据结构·算法·leetcode
cynicme6 小时前
力扣3318——计算子数组的 x-sum I(偷懒版)
java·算法·leetcode
天若有情6737 小时前
【java EE】IDEA 中创建或迁移 Spring 或 Java EE 项目的核心步骤和注意事项
后端·spring·java-ee·intellij-idea
青云交7 小时前
Java 大视界 -- Java 大数据在智能教育学习效果评估与教学质量改进实战
java·实时分析·生成式 ai·个性化教学·智能教育·学习效果评估·教学质量改进
崎岖Qiu7 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
Lei活在当下8 小时前
【现代 Android APP 架构】09. 聊一聊依赖注入在 Android 开发中的应用
java·架构·android jetpack
不穿格子的程序员8 小时前
从零开始刷算法-栈-括号匹配
java·开发语言·
lkbhua莱克瓦249 小时前
Java练习-正则表达式 1
java·笔记·正则表达式·github