金山云10.19笔试

题目1,dfs,AC100%

public class Main {
    /*
    @金山云1
    时间限制: 3000MS
    内存限制: 589824KB
    题目描述:
    现在给你N个正整数,从中选取3个数字的和,刚好能够组成M的倍数。请问存在多少种不同的选取方案?
    相同的一组数如果次序不同只能算做一种方案,不同位置的相同数字需当做同一个数字看待。
    例如一组数字[2,3,3,4],从中选取3个数字的和来组成3的倍数,只存在一种方案(2,3,4)。

    输入描述
    单组数据。 第1行输入两个正整数N和M,N<=20。 第2行输入N个正整数,两两之间用空格隔开。
    输出描述
    输出不同的选取方案的数量。
    样例输入
    4 3
    2 3 3 4
    样例输出
    1
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int[] arr = new int[N];
        // 读取N个数据...
        for (int i = 0; i < N; i++) {
            arr[i] = scanner.nextInt();
        }
        long[] result = new long[1];
        Set<String> set = new HashSet<>();
//        dfs2(arr, set, new ArrayList<>(), 0);
        dfs(arr, set, new ArrayList<>(), new boolean[arr.length]);

        set.forEach(e -> {
            int sum = Arrays.stream(e.split("_")).mapToInt(Integer::parseInt).sum();
            if ((sum) % M == 0) {
                result[0]++;
            }
        });
        System.out.println(result[0]);
    }

    /**
     * AC 100% 全排列---
     */
    public static void dfs(int[] arr, Set<String> set, List<Integer> list, boolean[] visited) {
        if (list.size() == 3) {
            if (isValid(set, list)) {
                set.add(getString(list, 0, 1, 2));
            }
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            if (visited[i]) {
                continue;
            }
            visited[i] = true;
            list.add(arr[i]);
            dfs(arr, set, list, visited);
            list.remove(list.size() - 1);
            visited[i] = false;
        }
    }

    /**
     * 会TLE,AC82%,时间复杂度很高---遍历所有元素,可以选择可以不选择...
     */
    public static void dfs2(int[] arr, Set<String> set, List<Integer> list, int index) {
        if (list.size() == 3) {
            if (isValid(set, list)) {
                set.add(getString(list, 0, 1, 2));
            }
            return;
        }
        // 判断第i个元素要与不要...
        for (int i = index; i < arr.length; i++) {
            // 第一种选择是当前元素不要...
            dfs2(arr, set, list, i + 1);

            // 第二种选择是当前元素要...
            list.add(arr[i]);
            dfs2(arr, set, list, i + 1);
            list.remove(list.size() - 1);
        }
    }

    public static boolean isValid(Set<String> set, List<Integer> list) {
        return !set.contains(getString(list, 0, 1, 2)) &&
                !set.contains(getString(list, 0, 2, 1)) &&
                !set.contains(getString(list, 1, 0, 2)) &&
                !set.contains(getString(list, 1, 2, 0)) &&
                !set.contains(getString(list, 2, 0, 1)) &&
                !set.contains(getString(list, 2, 1, 0));
    }

    public static String getString(List<Integer> list, int... index) {
        return list.get(index[0]) + "_" + list.get(index[1]) + "_" + list.get(index[2]);
    }
}

题目2.也不太会做,简单dfs搜索去做的,能AC45%,然后TLE了。

public class Main {
    /*
        @金山云2
        时间限制: 3000MS
        内存限制: 589824KB
        题目描述:
        给出n个正整数,这n个正整数中可能存在一些相同的数。现在从这n个数中选取m个正整数,分别记为X1、X2、......、Xm,
        使得这m个数满足如下公式: 1/X1 + 1/X2 + ...... + 1/Xm = 1 请问存在多少种不同的数字组合可以使得上述公式得以成立?
        输入描述
        单组输入。 第1行输入一个正整数n,表示输入的正整数个数。(n<=100) 第2行输入n个正整数,两两之间用空格隔开。

        输出描述
        输出满足要求的组合个数。如果一个组合都不存在,则输出“No solution!”。


        样例输入
        6
        1 2 2 3 4 4
        样例输出
        3

        提示
        对于输入样例中的6个正整数,存在3种和为1的组合,分别是:1=1/1,1=1/2+1/2,1=1/2+1/4+1/4。
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] arr = new int[N];
        // 扫描N个数据...
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
        }
        long[] result = new long[1];
        dfs(arr, new ArrayList<>(), 0, result, new HashSet<>());
        System.out.println(result[0] == 0 ? "No solution!" : result[0]);
    }

    /**
     * AC 45%测试用例,然后TLE了
     */
    public static void dfs(int[] arr, List<Integer> list, int index, long[] result, Set<List<Integer>> set) {
        int check = check(list);
        if (check == 0) { // 如果符合,那么需要统计
            if (!set.contains(list)) {
                result[0]++;
                set.add(list);
            }
            return;
        }
        if (check > 0) {
            return;
        }
        for (int i = index; i < arr.length; i++) {
            dfs(arr, list, i + 1, result, set);
            list.add(arr[i]);
            dfs(arr, list, i + 1, result, set);
            list.remove(list.size() - 1);
        }
    }

    public static int check(List<Integer> list) {
        long multi = 1;
        // 计算累乘和
        for (int i = 0; i < list.size(); i++) {
            multi *= list.get(i);
        }
        // 计算除去当前元素的所有元素的乘积之和...
        long sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += multi / list.get(i);
        }
        return Long.compare(sum, multi);
    }
}
#金山云##笔经#
全部评论
我是10月13号笔试的,还还没有面试通知,楼主有吗
点赞 回复 分享
发布于 2021-10-20 15:28

相关推荐

📍面试公司:美图👜面试岗位:📖面试问题:1、实习中代码覆盖率实现方式?意义是什么?举一个以往测试中用到覆盖率的具体例子?2、实习中做了什么?功能测试和其他测试占比多少?对于自动化成效怎么看?3、有了解客户端的自动化吗?4、职业规划?压力追问:为什么选测开不选功能测试?如果做的是纯开发场景呢?5、美图秀秀-相机模块,在离线状态下从性能角度测试相机模块,有哪些需要关注的性能维度以及核心的测试场景?6、内存这一块呢有哪些测试场景?压力追问:为什么刚刚没有想到内存的场景?7、CPU占用过大对用户有什么影响?8、美图秀秀首页有一些素材,是从后台拉过来的数据,假如你在测试的过程中发现素材的内容没有加载成功,你该如何分析定位这个问题?压力追问:不要只讲可能性,还要具体到每一步排查的步骤,怎么操作的?怎么看前端交互是否正常?9、现在需要测一个linux主机,需要写一个工具测试主机的重启性能,假如重启n次要怎么写?10、需要去校对素材是否异常,效果测试脚本怎么写?压力追问:这个脚本能保证素材都正常显示,不会出现有些图片没加载出来的情况吗?11、如果给了你一个比较模糊的任务该怎么办?🙌面试体验:好难sos,太菜了我前半小时稳定发挥,后半小时被吊打麻了啊啊啊
点赞 评论 收藏
分享
总体流程:3.21&nbsp;&nbsp;一面3.26&nbsp;通知二面3.28&nbsp;二面4.2&nbsp;hr打电话通知已过,询问实习时间等问题,过两天发邮件每次面试我都选的周五,感觉会等的时间比较久一般来说三个工作日没回复就挂了,感觉选周五面试的话,周六周日不算每次都等5天给答复所以感觉如果想流程快一点建议面试时间选周一周二可能会快一点(?)二面:二面整体上感觉没有太多技术相关的问题,没有手撕,只做了一道sql,整体上感觉比较简单一如既往的自我介绍然后问为什么选择测开岗位然后又是问项目,觉得自己项目跟实际的场景有什么区别或者能怎么应用到实际的场景中(我有一个模糊测试的项目)后面谈到自己之前做过一点爬虫相关的东西,用过一点selenium然后就问我对selenium的理解如果没获取到元素怎么办爬取数据的量级(几千条)如果数据量比较大(比如几十万条),怎么修改(回答时简单提了下分布式,没有解释的很详细,举了个例子简单介绍了下自己的方案)问我学过哪些课程,什么操作系统计网之类的是不是学过我说学过,没有继续问具体的相关的知识后面问了一堆大模型相关的问题用过没有,怎么用,有什么了解(当时讲了两方面,一个是自己之前看过一篇大模型在测试领域应用的论文,很简单的讲了下,另一个是学习上,比如学习新的语言之类的,后面也顺着问了平时的学习方法,怎么学习新的语言等等一些相关问题)对自己科研以及学习上有什么帮助用过哪些大模型有什么特点后面有一些场景题问我有没有实习过(我说的是本科的一些校园的开发经历)问我如果项目过程中与其他成员出现分歧应该怎么办,怎么应对还问如何能让开发出的东西是符合客户需求的,先让从产品的角度讲,后面又问从开发的角度讲之后问了下一面有没有手撕,做出来了吗,我说做出来了,还问了下难度然后说一面写过的话就不手撕算法了,写道sql吧,就给了一道sql题目,很简单,比一面还简单,不过当时前面问了一堆非技术问题,脑子有点懵,有些地方写的有点小问题,不过提示之后也都答出来了最后还问了下实习时间之类的问题,然后就没了------------------------------------------------------------ 后续更新,一面过了,谢谢团子给机会------------------------------------------------------------一面:Cpp选手转测开也太难了,想着开发卷不动了,试试投测开,前几天面了美团1小时左右,等了4天没结果,感觉大概率又挂了先是自我介绍然后问对测试开发工作的理解项目问了快半小时(一个c++服务器开发,一个测试相关),感觉hr对项目还算感兴趣,主要我研究生是做模糊测试相关方向,虽然跟实际应用场景差距比较大,但是多少也算测试,所以这块问了很长时间测试相关知识和测试用例设计10分钟经典的给登录界面设计测试用例,漏了一种情况手撕是leetcode原题求数组中第k大元素两道sql题第一个大概是从账单表中找出当天消费额最高的10名顾客 group&nbsp;by&nbsp;然后&nbsp;按sum()排序最后limit10就行了第二个是额外给一个表,表里存储vip顾客,以及对应的vip等级,找出消费最高10名顾客以及他们对应的vip等级,在第一题的sql基础上改就行,注意用left&nbsp;join就行了,因为第一张表中的客户不一定在第二张表中 手撕和sql题都做出来了,但是4天了没结果,感觉大概率又挂了。。。反问阶段问了下内部主要用什么语言,全是java,感觉语言这块不匹配劣势还是太大了,现在这么卷,不对口的话面了也白面
查看20道真题和解析
点赞 评论 收藏
分享
评论
点赞
9
分享

创作者周榜

更多
牛客网
牛客企业服务