美团2024年秋招Java岗第二场笔试

算法第一道

小美对 gcd (最大公约数)很感兴趣,她会询问你t次。每次询问给出一个大于1的正整数n,你是否找到一个数字m(2 ≤m≤n),使得 gcd(n,m)为素数。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T(1<T< 100)代表数据组数,每组测试数据描述如下:在一行上输入一个整数 n (2 <n< 105)代表给定的数字

输出描述

对于每一组测试数据,在一行上输出一个整数,代表数字 m如果有多种合法答案,您可以输出任意一种。

/**
 * 对于m来说如果该数字本身为素数则直接输出就可以,如果本身不是素数,则在素数中找到一个可以除尽的数字便可以啦
 * 从第一个质数2开始遍历,直到遍历到n的平方根,如果n能被这个质数整除
 * 那么这个质数就是n的一个因子,输出这个质数即可。
 * 此时输出的这个质数也就是素数即为对应的m
 * @param args
 */
public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int k=scanner.nextInt();
    while (k-->0){
        int n=scanner.nextInt();
        boolean isPrime=true;
        for (int i=2;i<=Math.sqrt(n);i++){
            if(k%i==0){
                System.out.println(i);
                isPrime=false;
                break;
            }
        }
        if(isPrime=true){
            System.out.println(n);
        }
    }
}

算法第二道

小美有一个长度为 n 的数组,每次操作可以选择两个下标之和 j,将 a:减去1,将 aj加上 1。小美想知道最少需要多少次操作,可以使数组极差最小、

数组的极差为数组中最大值和最小的差

输入描述

第一行输入一个整数 n(2 < n < 105)代表数组的长度.

第二行输入 几 个整数 a1,a2,·..,an(1 ≤ a¡≤ 10°)代表数组的元素

输出描述

在一行上输出一个整数,表示最少需要多少次操作

public class Main2 {


    /**
     * 使得极差最小,只有两种情况
     * 1.几个数可以除尽,那么只需要计算小于平均值那一部分和平均数的差值加到一起就得到了(大于平均数的一样,因为每次取出两个数进行分别加减)
     * 2,几个数不可以除尽,则可以令其中几个为平均数(向下取整),另外几个为平均数+1
     * 由此可以得到最小极差只能有0或者1
     * @param args
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n + 1];
        long sum = 0;
        for (int i = 1; i <= n; ++i) {
            a[i] = scanner.nextInt();
            sum += a[i];
        }
        long ans = 0;
        long ave = sum / n;
        // 如果平均值刚好是整数,那么直接计算
        if (ave * n == sum) {
            for (int i = 1; i <= n; ++i) {
                //大于的跟小于的肯定是相等的。取其中的一部分就好啦
                if (a[i] < ave) {
                    ans += ave - a[i];
                }
            }
        } else {
            int cnt = (int) (sum - ave * n);
            cnt = n - cnt;
            Arrays.sort(a, 1, n + 1);
            for (int i = 1; i <= n; ++i) {
                if (i <= cnt && a[i] < ave) {
                    ans += ave - a[i];
                } else if (i > cnt && a[i] < ave + 1) {
                    ans += ave + 1 - a[i];
                }
            }
        }
        System.out.println(ans);
    }
}

算法第三道

小美和小团在玩一个游戏,游戏中有一个长度为 n 的数组 a1,a2,..,an 和一个固定的整数k。

游戏规则如下,双方都会执行最优策略:

第一步,小美选择一个非空的区间[l,r],将这个区间中的所有数字都乘上k。

第二步,小团选择一个非空的区间[l,r],将这个区间中的所有数字都乘上k。

记 sum =》 a:,小美想要让 sum 尽可能大,小团想让sum尽可能小,你需要求出最后 sum 的值。

输入描述

第一行输入两个整数n和k(1 ≤n≤ 1000;-105<k< 105)代表数组长度和固定的整数。

第二行输入 几 个整数 a1,Q2,·..,an(一105 < a¡< 105)代表数组,

输出描述

在一行上输出一个整数表示答案。

第三题不太会,大佬们有什么好的思路吗

#美团求职进展汇总##悬赏#
秋招笔面记录 文章被收录于专栏

秋招中的笔试以及面记录

全部评论
算法题第一问为什么是判断 k%i ==0呢
点赞 回复 分享
发布于 2024-08-24 08:54 江西
第三题可以看看我帖子
点赞 回复 分享
发布于 2024-08-17 23:27 浙江

相关推荐

03-12 21:03
已编辑
深圳大学 Java
#腾讯音乐26届实习#&nbsp;问项目问MySQL,还有什么类型的锁,答插入意向锁、元数据锁问元数据锁是什么锁,答在对表的结构做更改的时候加的锁问生产环境如果对一个千万级大表加字段,怎么避免长时间加锁,因为看过生产环境加索引的方案,然后转移话题说生产环境加索引要怎么加,答建一个新表,加字段/索引,将原表数据导入新表,将期间的增量数据导入新表,新旧表改名问给一个update,条件包括id、age、name,age&amp;amp;amp;lt;16,会发生什么,答会把&amp;amp;amp;lt;16的数据都锁住,特别讲了下16边界情况的next-key-lock问索引,答举例一个索引建在name上面,根据字典序排序,如果是前缀模糊查询能走索引,%开头会失效,展开讲了索引失效的几种情况,举例实际应用时怎么避免索引失效问B树和B+树的区别,答B+树数据都在叶子节点,IO次数少,支持范围查询,插入删除方便问网络,TCP连接和断开连接过程,答三次握手四次挥手问Java,有没有用过多线程,回答提了一嘴用过ComparableFuture,然后转移话题到做过的定时任务怎么配置线程池问往线程池里面放一个线程会怎样,答根据核心线程数、最大线程数、拒绝策略决定执行流程问拒绝策略有哪些,没答上问有没有在Java中使用过事务,Java中是怎么实现的,答@EnableTransactionManager&nbsp;@Transactional可以实现声明式事务,还有方法可以实现编程式事务,推测@EnableTransactionManager会装配事务处理器,@Transactional是使用AOP问有没有用过Java其他相关组件,比如Spring、Redis相关的,答在海关有用SpringCloud反问那边业务,说是跟独立音乐人的内容和签约相关的业务,问是不是确实是暑期带转正说是,问培训制度,说跟这边差不多,就只是有导师带
查看13道真题和解析
点赞 评论 收藏
分享
评论
10
26
分享

创作者周榜

更多
牛客网
牛客企业服务