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;
    }
相关推荐
骆晨学长6 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
是小Y啦7 分钟前
leetcode 106.从中序与后续遍历序列构造二叉树
数据结构·算法·leetcode
AskHarries11 分钟前
利用反射实现动态代理
java·后端·reflect
@月落12 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
程序猿练习生13 分钟前
C++速通LeetCode中等第9题-合并区间
开发语言·c++·leetcode
liuyang-neu17 分钟前
力扣 42.接雨水
java·算法·leetcode
z千鑫21 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
万河归海42825 分钟前
C语言——二分法搜索数组中特定元素并返回下标
c语言·开发语言·数据结构·经验分享·笔记·算法·visualstudio
Flying_Fish_roe35 分钟前
Spring Boot-Session管理问题
java·spring boot·后端
赚钱给孩子买茅台喝36 分钟前
智能BI项目第四期
java·spring boot·spring cloud·aigc