2024.6Java笔试题(算法)

今天进行了一场Java笔试我感觉题目都挺简单的

用java语言完成下面题目的编写并运行输出结果(可以用在线编程网站,或者自己本地的编程软件编写代码)

1.给定三个List,编写一个方法删除所有重复的字符串,并保持原有顺序不变。 测试数据:["apple" "banana", “apple" "orange" , "banana", "grape", "grape"] 输出:["apple",“banana", "orange", "grape"]

2.给定一个Mapsstring,Integer>,其中键是名字,值是年龄。编写一个方法找出年龄最大的三个人的名字。 测试数据:{"John*:35, "Bob": 40, "Alice": 30, "Tom": 45, "Jerry":50} 输出:["Jerry"],

3.编写一二个方法,接收一个List,返回一个Map,其中键是列表中的字符串,值是该字符串在列表中出现的次数。 测试数据:["apple",“banana" "apple" "orange" “banana",*grape", "grape"] 输出:{"apple":2, "banana": 2, "orange": 1, "grape": 2}

4.给定一个ListsString 测试数据:【#123", 输出:数字列表:[”123, 5.给定一个Map<String,List<Integer》〉 ,键是学生的名字,值是他们的成绩列表。编写一个方法,返回一个新的Map,键是学生的名字,值是他们的平均成绩。 测试数据:{"John”:[85,90,95], *Bob": [80,85, 9e],〝Alice": [95, 100, 105]) “Bob”: 85.9, "Alice":100.0} 6.给定一个List,每个字符串都是一个由逗号分隔的名字和电子邮件地址(例如,“JohnDoe,john@doe.com")。编写一个方法,将这个列表转换为一个Map,其中键是电子邮件地址,值是对应的名字。 测试数据:["John Doe,john@doe.com", "Bob Smith, bob@smith.com", "Alice Johnson, alice@johnson.com"] "bob@smith.com": "Bob Smith", "alice@johnson.com": "Alice Johnson"]

 1. 删除重复字符串

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape");
        System.out.println(removeDuplicates(list));
    }

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

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

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> ages = new HashMap<>();
        ages.put("John", 35);
        ages.put("Bob", 40);
        ages.put("Alice", 30);
        ages.put("Tom", 45);
        ages.put("Jerry", 50);
        
        System.out.println(findTopThreeAges(ages));
    }

    public static List<String> findTopThreeAges(Map<String, Integer> map) {
        PriorityQueue<Map.Entry<String, Integer>> maxHeap = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
        maxHeap.addAll(map.entrySet());
        
        List<String> topThree = new ArrayList<>();
        for (int i = 0; i < 3 && !maxHeap.isEmpty(); i++) {
            topThree.add(maxHeap.poll().getKey());
        }
        return topThree;
    }
}

3. 统计字符串出现次数

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "orange", "banana", "grape", "grape");
        System.out.println(countOccurrences(list));
    }

    public static Map<String, Integer> countOccurrences(List<String> list) {
        Map<String, Integer> counts = new HashMap<>();
        for (String s : list) {
            counts.put(s, counts.getOrDefault(s, 0) + 1);
        }
        return counts;
    }
}

4. 提取数字列表(此题未提供完整要求,假设为提取字符串中的数字)

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        List<String> list = Collections.singletonList("#123");
        System.out.println(extractNumbers(list));
    }

    public static List<String> extractNumbers(List<String> list) {
        Pattern pattern = Pattern.compile("\\d+");
        List<String> numbers = new ArrayList<>();
        for (String s : list) {
            Matcher matcher = pattern.matcher(s);
            while (matcher.find()) {
                numbers.add(matcher.group());
            }
        }
        return numbers;
    }
}

5. 计算学生平均成绩

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Map<String, List<Integer>> scores = new HashMap<>();
        scores.put("John", Arrays.asList(85, 90, 95));
        scores.put("Bob", Arrays.asList(80, 85, 90));
        scores.put("Alice", Arrays.asList(95, 100, 105));
        
        System.out.println(calculateAverageScores(scores));
    }

    public static Map<String, Double> calculateAverageScores(Map<String, List<Integer>> map) {
        Map<String, Double> averages = new HashMap<>();
        for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
            double sum = 0;
            for (int score : entry.getValue()) {
                sum += score;
            }
            averages.put(entry.getKey(), sum / entry.getValue().size());
        }
        return averages;
    }
}

6. 转换名单到邮箱映射

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> emails = Arrays.asList("John Doe,john@doe.com", "Bob Smith,bob@smith.com", "Alice Johnson,alice@johnson.com");
        System.out.println(convertToEmailMap(emails));
    }

    public static Map<String, String> convertToEmailMap(List<String> list) {
        Map<String, String> emailMap = new HashMap<>();
        for (String s : list) {
            String[] parts = s.split(",");
            emailMap.put(parts[1].trim(), parts[0].trim());
        }
        return emailMap;
    }
}

7.Java算法题(较难)

按照如下的步骤处理输入:1.给定一个数组A[0,1...n-1],请构建一个数组B[0,1...n -1],其中B助的值是数组A中除了下标i以外的元素的和,然后再乘以3。2.对一个整数数组,使得数组中的每个元素只出现3次,将新数组从小到大排列后返回3.对一个整数数组,如果数组长度为O,返回6;如果数组长度为奇数,则取其中间7个元素,求和后返回;否则,取其中间6个元素求和后返回

public static int answer(int[] x) {
return
}

答案:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int[] x = {1, 2,3,4,5,6,7};//输入的数据
        int result = answer(x);
        System.out.println(result);
    }

    public static int answer(int[] x) {
        int totalSum = 0;

        // Calculate the total sum of elements in array x
        for (int num : x) {
            totalSum += num;
        }

        // Create an array to store the results
        int[] result = new int[x.length];


        for (int i = 0; i < x.length; i++) {
            result[i] = (totalSum - x[i]) * 3;
            System.out.println(result[i]);
        }
//        System.out.println(result.toString());

        Map<Integer, Integer> countMap = new HashMap<>();
        for (int num : result) {
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
        }

        List<Integer> resultt = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
            for (int i = 0; i < 3; i++) {
                resultt.add(entry.getKey());
            }
        }

        Collections.sort(resultt);
        System.out.println(Arrays.toString(resultt.toArray(new Integer[0])));
       Integer[]a= resultt.toArray(new Integer[0]);
//        System.out.println(a[1]);
//        return resultt.toArray(new Integer[0]);
        int sum=0;
        System.out.println(a.length);
if(a.length==0){
    sum=6;
}
else if(a.length%2!=0){
    for(int i=a.length/2-3;i<=a.length/2+3;i++){
        sum+=a[i];
        System.out.println(a[i]);
    }
}else{
    for(int i=a.length/2-3;i<a.length/2+3;i++){
        sum+=a[i];

}}



return sum;
    }
}

8.松鼠吃蘑菇(二进制)

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

答案:

要确定哪一种是毒蘑菇并在72小时后得到结果,我们可以使用二进制编码的方法来设计实验。给每只松鼠喂不同组合的蘑菇,通过观察哪些松鼠存活,可以确定毒蘑菇是哪一个。

考虑到一共有1011种蘑菇,我们需要足够的二进制位来唯一标识每一种蘑菇。1011转换成二进制需要10位(因为 210=1024210=1024,而最接近1011但不小于它的2的幂是1024),这意味着我们可以通过10位二进制数来编码所有可能的蘑菇种类。

每个二进制位对应一只松鼠,如果某位是1,则表示该松鼠会吃到相应编号的蘑菇;如果是0,则不吃。这样,通过观察哪些松鼠在72小时后死亡,我们就能确定毒蘑菇的二进制编码,从而找到毒蘑菇。

因此,最少需要10只松鼠来完成这个实验,每只松鼠对应一个二进制位,通过它们的生死情况(存活为0,死亡为1)来确定毒蘑菇的编号。接下来,我可以具体展示如何分配这些蘑菇给松鼠进行测试。

代码执行器完成调用

经过计算,确定毒蘑菇最少需要10只松鼠。这是因为要唯一标识1011种蘑菇中的任意一种,需要用10位二进制数(210=1024210=1024,最接近但不少于1011),每位二进制数对应一只松鼠。通过这10只松鼠的生死结果,我们可以在72小时后通过解码二进制信息准确找到毒蘑菇

那么有个小细节每个松鼠是怎么吃的呢?

为了通过10只松鼠确定哪种是毒蘑菇,我们需要按照它们对应的二进制位来分配蘑菇。下面是分配方法的详细说明:

  1. 编码蘑菇: 首先,给每种蘑菇一个从1到1011的编号。然后,将这些编号转换为10位的二进制数。例如,第1种蘑菇编号为1,其二进制为0000000001;第1011种蘑菇编号为1011,其二进制为1000001011(如果需要的话,前面补足0至10位)。

  2. 分配给松鼠: 每一位二进制数(从最低位到最高位,即从右边开始往左边数)对应一只松鼠。如果某个蘑菇的二进制表示在某个位置是1,那么那只对应的松鼠就需要吃这种蘑菇。如果是0,则不吃。

例如:

  • 松鼠1对应最右边的第一位。
  • 松鼠2对应第二位,依此类推,直到松鼠10对应最左边的第十位。
  1. 喂食计划:

    • 第1天,松鼠1会吃所有二进制最低位为1的蘑菇,松鼠2吃所有第二位为1的蘑菇,以此类推。
    • 因此,如果毒蘑菇的二进制表示中第n位是1,那么第n只松鼠将会吃到毒蘑菇。
  2. 观察结果: 在72小时之后,观察哪些松鼠存活,哪些死亡。如果松鼠i死了,我们知道毒蘑菇的二进制表示中第i位是1。如果松鼠i活着,那么这一位就是0。

  3. 确定毒蘑菇: 将所有死亡松鼠对应的二进制位标记为1,其余为0,得到的二进制数转换成十进制编号,即可确定毒蘑菇的种类。

通过这种方式,我们能确保在72小时结束时,仅通过观察松鼠的生死情况就能确切地指出哪一种是毒蘑菇,而不需要对每种蘑菇单独测试。

java笔试题算法 目录 :envelope: 说明 项目介绍 该文档主要是笔主在学习 Java 的过程中的一些学习笔记,但是为了能够涉及到大部分后端学习所需的技术知识点我也会偶尔引用一些别人的优秀文章的链接。文档大部分内容都是笔者参考书籍以及自己的原创。少部分面试题回答参考了其他人已有答案,上面都已注明。 该文档涉及的主要内容包括: Java、 数据结构与算法、计算机网络与数据通信、 操作系统、主流框架、数据存储、架构、面试必备知识点等等。相信不论你是前端还是后端都能在这份文档中收获到东西。 关于转载 如果需要引用到本仓库的一些东西,必须注明转载地址!!!毕竟大多都是手敲的,或者引用的是我的原创文章,希望大家尊重一下作者的劳动:grinning_face_with_big_eyes::grinning_face_with_big_eyes::grinning_face_with_big_eyes:! 如何对该开源文档进行贡献 笔记内容大多是手敲,所以难免会有笔误,你可以帮我找错别字。 很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。 现有的知识点难免存在不完善或者错误,所以你可以对已有知识点的修改/补充。 为什么要做这个开源文档? 在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫:grinning_face_with_smiling_eyes:)。所以,我决定通
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值