大厂校招真实题目:List去重你能想到几种?

前言

在技术面试中,尤其是大厂的校招面试,经常会遇到一些看似简单但实际上考察面试者编程思维和基础知识的问题。本文将详细介绍如何使用多种方法对Java中的List进行去重,这些方法不仅涵盖了基础的循环遍历,还包括了更高级的集合操作和流式处理,此面试题也是本人朋友去大厂面试收集,大家如果有遇到哪些面试题也可以在评论区留言。

1. 基础方法:for循环遍历判断

最简单直接的方法是使用for循环遍历List,检查每个元素是否已经存在于新的List中。如果不存在,则将其添加到新的List中。这种方法虽然简单,但在处理大数据量时效率较低,因为每次添加元素时都需要遍历整个新List来检查是否存在。

private static void m1() {
    List<Integer> initList = Arrays.asList(70, 70, -1, 5, 3, 3, 4, 4, 4, 4, 99);
    List<Integer> srcList = new ArrayList<>(initList);
    List<Integer> newList = new ArrayList<>();

    for (int i = 0; i < srcList.size(); i++) {
        if (!newList.contains(srcList.get(i))) {
            newList.add(srcList.get(i));
        }
    }
    System.out.println(newList);
}

运行结果如下:

2. 进阶方法:使用Set去重

Set是一种不允许重复元素的集合,因此可以利用这一特性来去除List中的重复元素。这里可以使用HashSet或者LinkedHashSet,前者不保证元素的顺序,而后者则保持元素的插入顺序。

private static void m2()
{
    List<Integer> srcList = Arrays.asList(70,70,-1,5,3,3,4,4,4,4,99);
    // 使用HashSet不保证顺序
    List<Integer> newList = new ArrayList<>(new HashSet<>(srcList));
    newList.forEach((s) -> System.out.print(s+" "));
    System.out.println();
    System.out.println();
    // 使用子类LinkedHashSet保证顺序
    newList = new ArrayList<>(new LinkedHashSet<>(srcList));
    newList.forEach((s) -> System.out.print(s+" "));
    System.out.println();
    System.out.println();
}


运行结果如下:

看新机会,民族企业核心部门,base武汉、深圳、东莞、西安、上海、北京、苏州等地

前、后端or测试>>>→机会

3. Stream流式计算

Java 8引入了Stream API,提供了一种更为简洁和高效的方式来处理集合。通过使用distinct()方法,可以轻松去除List中的重复元素,并且代码更加简洁易读,这个去重是十分方便的.

private static void m3() {
    List<Integer> initList = Arrays.asList(70, 70, -1, 5, 3, 3, 4, 4, 4, 4, 99);
    List<Integer> srcList = new ArrayList<>(initList);
    List<Integer> newList = srcList.stream().distinct().collect(Collectors.toList());
    newList.forEach((s) -> System.out.print(s + ", "));
}

运行结果如下:

4. 使用indexOf和lastIndexOf前后索引不一致

这种方法通过比较元素的第一次出现和最后一次出现的索引来判断是否存在重复。如果两个索引不一致,则说明存在重复元素,可以将其从List中移除。


private static void m4()
{
    List<Integer> initList = Arrays.asList(70,70,-1,5,3,3,4,4,4,4,99);
    // 使用ArrayList进行remove操作
    List<Integer> srcList = new ArrayList<>(initList);
    List<Integer> newList = new ArrayList<>(initList);

    System.out.println(srcList.indexOf(70));
    System.out.println(srcList.lastIndexOf(70));


    for (Integer element : srcList) {
        // 前后索引不一致,说明有重复
        if(newList.indexOf(element) != newList.lastIndexOf(element)) {
            newList.remove(newList.lastIndexOf(element));
        }
    }
    newList.forEach((s) -> System.out.print(s+", "));
    System.out.println();
    System.out.println();
}


运行结果,可以看到列表中元素70的下标分别为0,1

5. 双for循环对比

这是一种较为传统的方法,通过嵌套for循环来比较元素是否相同,如果相同则从List中移除。这种方法的时间复杂度较高,不推荐在大数据量时使用。

private static void m5() {
    List<Integer> initList = Arrays.asList(70, 70, -1, 5, 3, 3, 4, 4, 4, 4, 99);
    List<Integer> srcList = new ArrayList<>(initList);
    List<Integer> newList = new ArrayList<>(initList);

    for (int i = 0; i < newList.size() - 1; i++) {
        for (int j = newList.size() - 1; j > i; j--) {
            if (newList.get(j).equals(newList.get(i))) {
                newList.remove(j);
            }
        }
    }
    newList.forEach((s) -> System.out.print(s + " "));
}

可以看到每一次都要遍历一次列表进行对比。

总结

以上五种方法各有优劣,适用于不同的场景。基础方法简单易懂,但效率较低;进阶方法和Stream流式计算更为高效且代码简洁;使用indexOf和lastIndexOf的方法较为直观;双for循环对比则应尽量避免在大数据量时使用,在实际开发中,应根据具体需求选择最合适的方法。个人觉得比较方便的是使用java8的stream进行过滤。

——转载自:小明爱吃火锅

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-05 11:17
1.上来是一个括号匹配,用的map+stack,写完估计还没过去五分钟,然后问我为什么用map,和if&nbsp;else&nbsp;有什么区别,答:逻辑没有那么复杂,匹配比较简单。然后是这个题的一些拓展问题,也答上来了,但是费了一些时间。2.然后是有一个rand2函数,如何用这个函数写一个rand11,这个没什么思路,就说使用go语言完全随机的select解决,面试官问有没有其他方法,没想到。代码面试结束。3.之后是自我介绍,我是&nbsp;密码科学与技术的(也是计算机大类的),不知道专业有没有影响4.输入网址后会发生什么,浏览器解析-查询cookie-dns解析-tcp链接-tls链接-发送http报文-服务器响应-返回http响应-浏览器渲染。我也答了中间步骤中一些重要的部分,比如dns用的什么,tcp三次握手,tls握手有什么重点,用了什么加密方式。5.讲一讲jwt,回答了一些加密方面的函数。面试官问有什么优势,答:理论上body可以存储无限的内容,相比对每个字段都加密,能省一些响应时间等等吧。知不知道其他的,答:知道OAwth2.0,但是不了解6.讲一讲doker,讲了一些自己对docker的使用,还有一些遇到的问题,面试官问如何解决问题,答:一般是先问ai是什么方面的,基本上都是镜像连不上,然后就是切换一些国内镜像比如一些高校的或者阿里云。7.docker要是遇到镜像比较大怎么办,答:因为镜像其实只需要可运行的部分,有可能在包镜像的时候把不需要的部分都装进去了。还有就是使用官方的镜像,举了个例子golang&nbsp;1.21-alphine8,了解reids吗,了解。说一下高可用,说了主从,哨兵,cluster集群,都把我知道的内容全说了,包括什么全量复制,增量复制,客观下线,主管下线,选举主节点,谣言传播。9.&nbsp;cluster相比单节点有什么优势。答:举了个例子,如果有很多热key,cluster可以散列这些热key10,看我项目用过腾讯云cos是,说一下是干嘛的,就是存储桶,我是是用这个来模拟一个云盘。具体是怎么用的。答:通过官方提供的包来操作这个存储桶,包括新建文件夹,上传文件等等,具体还有就是使用文件名,桶名拼接url面试结束,反问1.有几轮面试2.什么时候能出面试结果3.筛选实习生时看重什么
查看10道真题和解析
点赞 评论 收藏
分享
头像
09-09 17:17
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务