大三学生实习面试经历(1)

news2024/11/17 18:29:12

最近听了一位学长的建议,不能等一切都准备好再去开始,于是就开始了简历投递,恰好简历过了某小厂的初筛,开启了线上面试,记录了一些问题:

(通过面试也确实了解到了自己在某些方面确实做的还不够充分,需要继续努力)

1.思维题毒蘑菇

现在有1011种蘑菇,其中1种是毒蘑菇。人一旦吃了微量的毒蘑菇,就会在72小时后发作身亡。现在用松鼠做试验,从开始喂松鼠计时,要在72小时后马上找出毒蘑菇,问最少需要多少只松鼠?(需要给出解题过程)

要找出1011种蘑菇中的毒蘑菇,我当时回答的是使用二进制数的方法来减少所需的松鼠数量。具体过程如下:

  1. 理解问题:我们有1011种蘑菇,且知道其中只有一种是毒蘑菇。我们的目标是在72小时后确定哪一种是毒蘑菇。

  2. 二进制编码:我们可以将每一种蘑菇用一个二进制数来表示。由于我们有1011种蘑菇,我们需要找到一个足够的二进制位数,以便能够区分所有的蘑菇。

  3. 计算所需的位数:我们需要找到满足 ( 2^n 大于等于 1011 ) 的最小整数 ( n )。

    • 计算 ( 2^{10} = 1024 ),而 ( 2^9 = 512 )。
    • 因此,10位二进制数可以表示从0到1023的数字,可以区分1011种蘑菇。
  4. 分配松鼠:每一只松鼠可以对应二进制数中的一位:

    • 如果第 ( i ) 位为1,则该松鼠会吃掉对应的蘑菇;如果为0,则该松鼠不会吃。
    • 通过这种方式,每一只松鼠的生死情况(是否中毒)可以反映出对应的二进制位。
  5. 结果:因为需要10位二进制数来标识每一种蘑菇,所以我们至少需要10只松鼠。

结论

最少需要10只松鼠来确定哪一种蘑菇是毒蘑菇。

2.Java编程题

1.给定一个List<string〉,编写一个方法删除所有重复的字符串,并保持原有顺序不变
测试数据:[“apple”,“banana”,“apple”,“orange”,“banana”,“grape”,“grape”]
输出:[“apple”,“banana”,“orange”,“grape”]
2.给定一个Map<string,Integer〉,其中键是名字,值是年龄。编写一个方法找出年龄最人的三个人的名字。
测试数据:{“John”:35,“Bob”:40,“Alice”:30,“Tom”:45,“Jerry”: 50}
输出:[Jerry","TOm””“Bob”
3.编写一个方法,接收一个List,返回一个Map,其中键是列表中的字符串,值是该字符串在列表中出现的次数。
测试数据:[“apple”,“banana”,“apple”,"orange”,“banana”,“grape”,“grape”
输出:{“apple”:2,“banana”:2,“orange”:1.“grape”: 2}
4.给定一个List,其中的字符串可能包含数字和字母。编写一个方法,将列表中的字符串分为两个列表,一个包含只包含数字的字符串,另一个包含只包含字母的字符串。
测试数据:「“123”,“abc”,“456”,“def”."789"“ghi”]
输出:数字列表:[“123”,“456”,“789”],字母列表:[“abc”,“def”,“ghi”]
5.给定一个Map<string,List>,键是学生的名字,值是他们的成绩列表。编写一个方法,返回一个新的Map,键是学生的名字,值是他们的平均成绩。
测试数据:{“John”:[85,90,95],“Bob”:[80,85,90],“Alice”:[95,100,105]}
输出:f"John”:90.0,“Bob”:85.0,“Alice”:180.0]
6.给定一个List<string〉,每个字符串都是一个山逗号分隔的名字和电子邮件地址(例如,“JohnDoe,john@doe.com”)。编写一个方法,将这个列表转换为一个Map,其中键是电子邮件地址,值是对应的名字
测试数据:[“John Doe,john@doe.com”“Bob smith,bob@smith.com”,“Alice Johnson,alice@iohnson.com”
输出:{“john@doe.com”:“John Doe”.“bob@smith.com”: “Bob Smith”, “alice@iohnson.com”: “Alice Johnson”}

下面是针对每个问题的重述、代码实现和思路分析

1. 删除所有重复的字符串,并保持原有顺序不变

题目重述:给定一个字符串列表,删除所有重复的字符串,并保持原有的顺序。

代码实现一

import java.util.*;

public class RemoveDuplicates {
    public static List<String> removeDuplicates(List<String> strings) {
        Set<String> seen = new LinkedHashSet<>(strings);
        return new ArrayList<>(seen);
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape");
        List<String> output = removeDuplicates(input);
        System.out.println(output); // 输出: [apple, banana, orange, grape]
    }
}

思路

  • 使用 LinkedHashSet 来存储字符串,LinkedHashSet 保持插入顺序且不允许重复元素。
  • 将输入列表传入 LinkedHashSet,然后转换回 ArrayList 以获得所需的输出格式。

代码实现二

import java.util.*;

public class RemoveDuplicates {
    public static List<String> removeDuplicates(List<String> strings) {
        List<String> result = new ArrayList<>();
        for (String str : strings) {
            if (!result.contains(str)) {
                result.add(str);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape");
        List<String> output = removeDuplicates(input);
        System.out.println(output); // 输出: [apple, banana, orange, grape]
    }
}

思路

  • 创建一个新的列表 result 来存储不重复的字符串。
  • 遍历输入列表,检查 result 中是否已包含当前字符串,如果没有,则添加它。

2. 找出年龄最小的三个人的名字

题目重述:给定一个映射,键是名字,值是年龄,找出年龄最小的三个人的名字。

代码实现一

import java.util.*;

public class YoungestPeople {
    public static List<String> findYoungest(Map<String, Integer> ages) {
        return ages.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByValue())
                .limit(3)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        Map<String, Integer> input = new HashMap<>();
        input.put("John", 35);
        input.put("Bob", 40);
        input.put("Alice", 30);
        input.put("Tom", 45);
        input.put("Jerry", 50);
        
        List<String> output = findYoungest(input);
        System.out.println(output); // 输出: [Alice, John, Bob]
    }
}

思路

  • Map 转换为流,按值(年龄)排序。
  • 使用 limit(3) 选择前3个最小的值,并提取相应的键(名字)。
  • 最后将结果收集到列表中。

代码实现二

import java.util.*;

public class YoungestPeople {
    public static List<String> findYoungest(Map<String, Integer> ages) {
        List<Map.Entry<String, Integer>> entryList = new ArrayList<>(ages.entrySet());
        entryList.sort(Map.Entry.comparingByValue());
        
        List<String> youngest = new ArrayList<>();
        for (int i = 0; i < Math.min(3, entryList.size()); i++) {
            youngest.add(entryList.get(i).getKey());
        }
        return youngest;
    }

    public static void main(String[] args) {
        Map<String, Integer> input = new HashMap<>();
        input.put("John", 35);
        input.put("Bob", 40);
        input.put("Alice", 30);
        input.put("Tom", 45);
        input.put("Jerry", 50);
        
        List<String> output = findYoungest(input);
        System.out.println(output); // 输出: [Alice, John, Bob]
    }
}

思路

  • Map 转换为列表并排序。
  • 选择前3个最小年龄的名字。

3. 计算字符串出现的次数

题目重述:给定一个字符串列表,返回一个映射,其中键是字符串,值是该字符串在列表中出现的次数。

代码实现一

import java.util.*;

public class CountOccurrences {
    public static Map<String, Integer> countOccurrences(List<String> strings) {
        Map<String, Integer> countMap = new HashMap<>();
        for (String str : strings) {
            countMap.put(str, countMap.getOrDefault(str, 0) + 1);
        }
        return countMap;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape");
        Map<String, Integer> output = countOccurrences(input);
        System.out.println(output); // 输出: {apple=2, banana=2, orange=1, grape=2}
    }
}

思路

  • 使用 HashMap 来存储每个字符串及其出现的次数。
  • 遍历列表,对于每个字符串,更新其计数。
  • 使用 getOrDefault 方法来处理未出现的字符串。

代码实现二

import java.util.*;

public class CountOccurrences {
    public static Map<String, Integer> countOccurrences(List<String> strings) {
        Map<String, Integer> countMap = new HashMap<>();
        for (String str : strings) {
            countMap.put(str, countMap.getOrDefault(str, 0) + 1);
        }
        return countMap;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape");
        Map<String, Integer> output = countOccurrences(input);
        System.out.println(output); // 输出: {apple=2, banana=2, orange=1, grape=1}
    }
}

思路

  • 使用 HashMap 来存储每个字符串及其出现的次数。
  • 遍历列表,更新计数。

4. 将字符串分为数字和字母列表

题目重述一:给定一个字符串列表,将字符串分为两个列表,一个包含只包含数字的字符串,另一个包含只包含字母的字符串。

代码实现

import java.util.*;

public class SeparateNumbersAndLetters {
    public static Map<String, List<String>> separate(List<String> strings) {
        List<String> numbers = new ArrayList<>();
        List<String> letters = new ArrayList<>();
        
        for (String str : strings) {
            if (str.matches("\\d+")) {
                numbers.add(str);
            } else if (str.matches("[a-zA-Z]+")) {
                letters.add(str);
            }
        }
        
        Map<String, List<String>> result = new HashMap<>();
        result.put("numbers", numbers);
        result.put("letters", letters);
        return result;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("123", "abc", "456", "def", "789", "ghi");
        Map<String, List<String>> output = separate(input);
        System.out.println("数字列表: " + output.get("numbers")); // 输出: [123, 456, 789]
        System.out.println("字母列表: " + output.get("letters")); // 输出: [abc, def, ghi]
    }
}

思路

  • 遍历字符串列表,使用正则表达式 matches 方法来判断字符串是数字还是字母。
  • 将对应的字符串添加到相应的列表中。
  • 最终将两个列表放入一个映射中返回。

代码实现二

import java.util.*;

public class SeparateNumbersAndLetters {
    public static Map<String, List<String>> separate(List<String> strings) {
        List<String> numbers = new ArrayList<>();
        List<String> letters = new ArrayList<>();
        
        for (String str : strings) {
            if (str.matches("\\d+")) {
                numbers.add(str);
            } else if (str.matches("[a-zA-Z]+")) {
                letters.add(str);
            }
        }
        
        Map<String, List<String>> result = new HashMap<>();
        result.put("numbers", numbers);
        result.put("letters", letters);
        return result;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("123", "abc", "456", "def");
        Map<String, List<String>> output = separate(input);
        System.out.println("数字列表: " + output.get("numbers")); // 输出: [123, 456]
        System.out.println("字母列表: " + output.get("letters")); // 输出: [abc, def]
    }
}

思路

  • 遍历字符串列表,使用正则表达式 matches 方法来判断字符串是数字还是字母。
  • 将对应的字符串添加到相应的列表中。

5. 计算学生的平均成绩

题目重述:给定一个映射,键是学生的名字,值是他们的成绩列表,返回一个新的映射,键是学生的名字,值是他们的平均成绩。

代码实现一

import java.util.*;

public class AverageGrades {
    public static Map<String, Double> calculateAverages(Map<String, List<Integer>> grades) {
        Map<String, Double> averages = new HashMap<>();
        
        for (Map.Entry<String, List<Integer>> entry : grades.entrySet()) {
            String name = entry.getKey();
            List<Integer> scores = entry.getValue();
            double average = scores.stream().mapToInt(Integer::intValue).average().orElse(0.0);
            averages.put(name, average);
        }
        
        return averages;
    }

    public static void main(String[] args) {
        Map<String, List<Integer>> input = new HashMap<>();
        input.put("John", Arrays.asList(85, 90, 95));
        input.put("Bob", Arrays.asList(80, 85, 90));
        input.put("Alice", Arrays.asList(95, 100, 105));
        
        Map<String, Double> output = calculateAverages(input);
        System.out.println(output); // 输出: {John=90.0, Bob=85.0, Alice=100.0}
    }
}

思路

  • 遍历每个学生的成绩列表,使用流计算平均值。
  • 将名字和对应的平均成绩存储在新的映射中。

代码实现二

import java.util.*;

public class AverageGrades {
    public static Map<String, Double> calculateAverages(Map<String, List<Integer>> grades) {
        Map<String, Double> averages = new HashMap<>();
        
        for (Map.Entry<String, List<Integer>> entry : grades.entrySet()) {
            String name = entry.getKey();
            List<Integer> scores = entry.getValue();
            double total = 0;
            for (int score : scores) {
                total += score;
            }
            averages.put(name, total / scores.size());
        }
        
        return averages;
    }

    public static void main(String[] args) {
        Map<String, List<Integer>> input = new HashMap<>();
        input.put("John", Arrays.asList(85, 90, 95));
        input.put("Bob", Arrays.asList(80, 85, 90));
        input.put("Alice", Arrays.asList(95, 100, 105));
        
        Map<String, Double> output = calculateAverages(input);
        System.out.println(output); // 输出: {John=90.0, Bob=85.0, Alice=100.0}
    }
}

思路

  • 遍历每个学生的成绩列表,计算总分并求平均。
  • 将名字和对应的平均成绩存储在新的映射中。

6. 将名字和电子邮件地址转换为映射

题目重述:给定一个字符串列表,每个字符串都是一个逗号分隔的名字和电子邮件地址,将这个列表转换为一个映射,其中键是电子邮件地址,值是对应的名字。

代码实现

import java.util.*;

public class NameEmailMapping {
    public static Map<String, String> mapNamesToEmails(List<String> entries) {
        Map<String, String> emailMap = new HashMap<>();
        
        for (String entry : entries) {
            String[] parts = entry.split(",");
            if (parts.length == 2) {
                String name = parts[0].trim();
                String email = parts[1].trim();
                emailMap.put(email, name);
            }
        }
        
        return emailMap;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("John Doe,john@doe.com", "Bob Smith,bob@smith.com", "Alice Johnson,alice@johnson.com");
        Map<String, String> output = mapNamesToEmails(input);
        System.out.println(output); // 输出: {john@doe.com=John Doe, bob@smith.com=Bob Smith, alice@johnson.com=Alice Johnson}
    }
}

思路

  • 遍历输入列表,使用 split 方法将每个字符串分为名字和电子邮件。
  • 将电子邮件作为键,名字作为值存入映射中。

代码实现二

import java.util.*;

public class NameEmailMapping {
    public static Map<String, String> mapNamesToEmails(List<String> entries) {
        Map<String, String> emailMap = new HashMap<>();
        
        for (String entry : entries) {
            String[] parts = entry.split(",");
            if (parts.length == 2) {
                emailMap.put(parts[1].trim(), parts[0].trim());
            }
        }
        
        return emailMap;
    }

    public static void main(String[] args) {
        List<String> input = Arrays.asList("John Doe,john@doe.com", "Bob Smith,bob@smith.com");
        Map<String, String> output = mapNamesToEmails(input);
        System.out.println(output); // 输出: {john@doe.com=John Doe, bob@smith.com=Bob Smith}
    }
}

思路

  • 遍历输入列表,使用 split 方法将每个字符串分为名字和电子邮件。
  • 将电子邮件作为键,名字作为值存入映射中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2242331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现多线程编程

目录 一、创建线程 1.1.第一种方法&#xff1a;继承Thread类 1.2.第二种方法&#xff1a;实现Runnable接口 1.3.其他创建线程的方法 二、多线程的优势-增加运行速度 三、Thread类及常见方法 3.1 Thread常见的构造方法 3.2Thread的几个常见方法 3.2.1启动一个线程——sta…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里&#xff1f; 1、一个问题&#xff1a; 2、查看消费者消费主题__consumer_offsets 3、一个重要前提&#xff1a;消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了&#xff0c;你重启kafka之后&#xff0…

【设计模式】行为型模式(四):备忘录模式、中介者模式

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…

GRE做题笔记(零散的个人经验)

locomotive机车By 1813, the Luddite resistance had all but vanished. all but表示“几乎完全”的程度&#xff0c;或者表示排除piston活塞attributed to 归因于how a sportsperson accounted for their own experience of stress 运动员如何解释自己的压力经历 &#xff0c;…

【vmware+ubuntu16.04】vm虚拟机及镜像安装-tools安装包弹不出来问题

学习机器人这门课需要下载虚拟机&#xff0c;做一下记录 首先我下载的是vm虚拟机16&#xff0c; 下载版本可参考该文章课堂上我下载 的镜像是16.04&#xff0c;虚拟机安装教程和镜像添加可参考该博主 按照教程安装成功 安装tools&#xff0c;但是我的弹不出来那个压缩包&…

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片&#xff08;sharding&#xff0c;水平切分&#xff09;来进行数据共享&#xff0c;并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点&#xff08;node&#xff09;组成&#xff0c;在刚开…

第03章 文件编程

目标 了解Linux系统文件IO/标准IO基本概念掌握Linux系统文件IO/标准IO常用函数掌握Linux系统文件属性常用函数掌握Linux系统目录文件常用函数 3.1 Linux系统概述 3.1.1 预备知识&#xff08;相关概念&#xff09; &#xff08;1&#xff09;应用程序 和 内核程序 应用程序是…

51c大模型~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/11859244 #猎户座 「草莓」即将上线&#xff0c;OpenAI新旗舰大模型曝光&#xff0c;代号「猎户座」 ChatGPT 要进化了&#xff1f; 本月初&#xff0c;OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片&#xff0…

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下&#xff1a; 启动类所在包&#xff1a; com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下&#xff0c;就会导致启动类无法扫描到该类&#xff0c;从而无法对…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中&#xff0c;我们了解了基础的网络知识&#xff0c;网络的出…

机器学习 AdaBoost 算法

AdaBoost 提升学习算法是通过训练多个弱分类算法实现一个强分类算法&#xff0c;做法非常朴素&#xff0c;在训练过程中&#xff0c;提供分类错误的数据权重&#xff0c;降低分类正确的权重&#xff0c;提高分类效果好的弱分类器权重&#xff0c;降低分类效果差的若分类器权重。…

C++编程技巧与规范-类和对象

类和对象 1. 静态对象的探讨与全局对象的构造顺序 静态对象的探讨 类中的静态成员变量(类类型静态成员) 类中静态变量的声明与定义&#xff08;类中声明类外定义&#xff09; #include<iostream> using namespace std;namespace _nmspl {class A{public:A():m_i(5){…

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包&#xff0c;那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入&#xff0c;那么它只会被导入一次&#xff08;例如很多包可能都会用到 fmt 包&#xff0c;但 它只会被导入一次&#x…

【大数据学习 | flume】flume之常见的sink组件

Flume Sink取出Channel中的数据&#xff0c;进行相应的存储文件系统&#xff0c;数据库&#xff0c;或者提交到远程服务器。Flume也提供了各种sink的实现&#xff0c;包括HDFS sink、Logger sink、Avro sink、File Roll sink、HBase sink&#xff0c;。 ​ Flume Sink在设置存…

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字&#xff0c;这些数字被分成多个小组&#xff0c;并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…

构建安全护盾:HarmonyOS 应用的数据安全审计与日志管理实战

文章目录 前言数据安全审计与日志管理的重要性什么是数据安全审计&#xff1f;为什么需要日志管理&#xff1f; 数据安全审计与日志管理的基本原则实现数据安全审计与日志管理的技术方案1. 数据安全审计的实现2. 日志管理的实现 ArkUI 与 ArkTS 的代码示例1. 审计日志记录2. 实…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…

HarmonyOS 开发环境搭建

HarmonyOS&#xff08;鸿蒙操作系统&#xff09;作为一种面向全场景多设备的智能操作系统&#xff0c;正逐渐在市场上崭露头角。为了进入HarmonyOS生态&#xff0c;开发者需要搭建一个高效的开发环境。本文将详细介绍如何搭建HarmonyOS开发环境&#xff0c;特别是如何安装和配置…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

【提高篇】3.3 GPIO(三,工作模式详解 上)

目录 一,工作模式介绍 二,输入浮空 2.1 输入浮空简介 2.2 输入浮空特点 2.3 按键检测示例 2.4 高阻态 三,输入上拉 3.1 输入上拉简介 3.2 输入上拉的特点 3.3 按键检测示例 四,输入下拉 4.1 输入下拉简介 4.2 输入下拉特点 4.3 按键检测示例 一,工作模式介绍…