阿里0325笔试情况

https://blog.csdn.net/weixin_44484668/article/details/123470439
单选题6个,每题2分,各个类型都有,比较简单。
多选题6个,每题4分,少选给1/3分,也不难,就是有的会比较纠结
编程题三道,一道easy,一道medium,一道hard。
第一题简单字符串模拟(14分),问密码情况,满足三个条件:

比较坑的点在于输出这些英文容易输错(可以cv),ACM模式下很多人不会正确的输入输出导致只有80%正确率,比如int后需要接受空格,字符串可能存在空格的情况。
关于java在ACM中的输入输出可以看我的这篇文章
class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        String next = sc.nextLine();
        HashSet<String> set = new HashSet<>();
        for (int i = 0; i < t; i++) {
            String str = sc.nextLine();
            if (str.length() < 5 || str.length() > 12) System.out.println("字符串长度不合法");
            else if (!isLetter(str)) System.out.println("非全英文字符串");
            else if (set.contains(str)) System.out.println("字符串存储过了");
            else {
                set.add(str);
                System.out.println("合法字符串");
            }
        }
    }

    private static boolean isLetter(String str) {
        for (int i = 0; i < str.length(); i++) {
            if (!Character.isLetter(str.charAt(i))) return false;
        }
        return true;
    }
}


第二题(20分),没做出来,自己太菜了,做题也少。这道题看着挺简单的,然后0%通过就懵了,时间都花在第二题了,导致第三题没时间做。

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int[] nums = new int[5];
            for (int j = 0; j < 5; j++) {
                nums[j] = sc.nextInt();
            }
            Arrays.sort(nums);
//            System.out.println(min1 + "\t" + min2 + "\t" + min3);
            int res = 0;
            if (nums[1] == nums[2]) {
                res = nums[1];
            } else {
                res = nums[1] + Math.min(nums[0], nums[2] - nums[1]);
            }
            System.out.println(res);
        }
    }
0分,没想通。

第三题(30分)背包问题,参考大佬的题解,发现确实是01背包问题,不过贪心也可以过一些案例。
思路是只要斜率k=-a/b不一样,那么两条直线必相交。用一个map存储斜率和对应的条数,比如[1-2],[2-3],[3-4],那么就和力扣416. 分割等和子集494. 目标和1049. 最后一块石头的重量 II这几道题一样了。
只有两个颜色,所以将对应的条数分为两堆,一堆为x(白色),一堆为y(黑色),题目要求xy最大,当且仅当x==y时最大,但是背包问题不一定满足两堆个数一样,所以最后结果就是x(sum-x)。
不得不说背包用来求子集划分问题还是很好用的。

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        //key-斜率,value-个数
        HashMap<Double, Integer> map = new HashMap<>();
        for (int i = 0; i < t; i++) {
            int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();//c没用
            double k = 1.0 * a / b;//用double,int会把1.1和1.9斜率算成一样
            map.put(k, map.getOrDefault(k, 0) + 1);
        }
        int sum = 0, n = map.size();
        int[] weight = new int[n], values = new int[n];
        int index = 0;
        for (Map.Entry<Double, Integer> entry : map.entrySet()) {
            sum += entry.getValue();
            weight[index] = entry.getValue();
            values[index] = entry.getValue();
        }
        int w = sum / 2;
        //dp[n][w]:针对所有的条数,不超过一半和的最大和,比如[1,3,3],凑不超过3的最大和,就是[3]了,所以一堆是3,一堆是4,结果12.
        //dp[i][j]:前i个物品,第i个物品的重量是weight[i],价值是value[i],背包容量是j,求最大价值。
        int[][] dp = new int[n + 1][w + 1];
        //base case
        //dp[0][...]=0;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= w; j++) {
                if (j >= weight[i - 1]) {//能够装下第i个物品
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i - 1]] + values[i - 1]);
                } else {
                    dp[i][j] = dp[i - 1][j];//装不下第i个物品
                }
            }
        }
        System.out.println(dp[n][w] * (sum - dp[n][w]));//一堆和是x,一堆和是y
    }
}


这题我暴力就过了10%的案列,第二题懵了,第三题没时间看。
总结下来就是,时间没分配到位,选择题还检查了一遍(我也服了),以为最后一道题肯定hard所以就放弃了,但是这个确实还是比较接近leetcode原题的,给时间想想应该能想到,或者过多一些case,当然最主要还是太菜了。

#阿里笔试##笔试题目##阿里巴巴#
全部评论
hhh和我一样,第二题找不到反例,一提交0%通过
1 回复 分享
发布于 2022-03-25 22:07
第二题你可以试试2 4 4 5 6,你的程序 是不对的,我暴力过了40
点赞 回复 分享
发布于 2022-03-25 12:02
第二题的话这样可以吗 我赛后想到的
点赞 回复 分享
发布于 2022-03-25 12:05
请问第二部分都是多选么 我看他写的不定项选择😭
点赞 回复 分享
发布于 2022-03-25 13:11
有选择答案不
点赞 回复 分享
发布于 2022-03-25 13:19
第三题这样写过了多少
点赞 回复 分享
发布于 2022-03-25 15:10
第二道编程题已经算hard了
点赞 回复 分享
发布于 2022-03-25 16:11
楼主有面试消息了吗
点赞 回复 分享
发布于 2022-03-25 23:09
第二题排序完之后,将序号1 3 4 5分别减一,然后循环排序减一,直到第一个数为0,输出减的次数加第二个数,过40%(超时)
点赞 回复 分享
发布于 2022-03-26 14:21
笔试的时候同一道题可以提交多次吗?会扣分吗?
点赞 回复 分享
发布于 2022-04-05 11:39
我之前好像做哪家笔试的时候做过,好像就是先排序从小到大,答案就是a[1]+Math.min(a[0], a[2]-a[1])吧
点赞 回复 分享
发布于 2022-04-14 13:50

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
6
72
分享
牛客网
牛客企业服务