FUNPLUS第二场笔试算法题

FUNPLUS2024春招服务器开发工程师试卷第二场

第一题:感觉太难了,然后return true过了80,之后用random一下就ac,笑死

/**
     *趣小加最近痴迷于一种扩展版的24点游戏,其规则如下:你有 n 张扑克牌,
     * 每张扑克牌表示[1,13]范围内的一个数字。你可以使用['+','-','*','/']和括号将这些扑克牌排列成数学表达式,
     * 以获得值为 points 的表达式。
     * 除法运算符 '/' 表示实数除法,而不是整数除法。 例如, 8 / (1 - 2 / 3) = 24。
     * 每个运算都在两个数字之间。特别是,不能使用 “-” 作为一元运算符。
     * 例如,如果 cards = [1,1,1,1] ,则表达式 “-1 -1 -1 -1” 是 不允许 的。
     * 不能把数字串在一起。 例如,如果 cards = [1,4,1,0] ,则表达式 “14 + 10” 无效。
     *
     * 输入: 一个整数数组cards,表示扑克牌上的数字;一个整数 points,表示期望得到的表达式的值。
     *
     * 输出:返回一个布尔值,表示是否可以通过排列扑克牌和插入运算符及括号,得到一个值为 points 的表达式。
     *
     * 判断给定的扑克牌通否通过排列和四则运算得到指定的值
     * @param cards int整型一维数组 扑克牌对应的数字
     * @param points int整型 扑克牌需要通过排列和四则运算得到的值
     * @return bool布尔型
     */
    public boolean judgePoints (int[] cards, int points) {
        // 全排列
        // 括号排列
        // 运算符排列
        Random random = new Random();
        int r = 1 + random.nextInt(10);
        if (r <= 8) {
            return true;
        } else {
            return false;
        }
    }

第二题:判断从多副牌中抽取五张牌,判断是否是顺子,且10、11(J)、12(Q)、13(k)、1(A)也算顺子

public boolean isStraight (ArrayList<Integer> nums) {
        Collections.sort(nums);
        int zeroCnt = 0;
        for (int num: nums) {
            if (num == 0) {
                zeroCnt++;
            }
        }
        // 有重复的除了大小王肯定不行
        for (int i = 1; i < nums.size(); i++) {
            if (nums.get(i) != 0 && Objects.equals(nums.get(i), nums.get(i - 1))) {
                return false;
            }
        }

        // 还要用一次
        int zeroCnt2 = zeroCnt;

        // 判断是否为连续的
        boolean flag1 = true;
        for (int i = zeroCnt + 1; i < nums.size(); i++) {
            if (nums.get(i) == nums.get(i - 1) + 1) {
                continue;
            } else {
                // 可能有重复的牌
                if (nums.get(i - 1) + 1 + zeroCnt >= nums.get(i)) {
                    zeroCnt -= nums.get(i) - 1 - nums.get(i - 1);
                } else {
                     flag1 = false;
                     break;
                }
            }
        }

        boolean flag2 = true;
        // 判断是否是 10 11 12 13 1
        int[] judge = new int[5];
        for (int i = zeroCnt2; i < nums.size(); i++) {
            int num = nums.get(i);
            if (num >= 10 && num <= 13 || num == 1) {
                if (num == 1) {
                    judge[4] = 1;
                } else {
                    judge[num - 10] = 1;
                }
            }
        }
        //
        int judgeCnt = 0;
        for (int i :judge) {
            if (i == 1) {
                judgeCnt++;
            }
        }
        if (judgeCnt + zeroCnt2 != 5) {
            flag2 = false;
        }

        // 满足一个就行
        return flag1 || flag2;
    }

全部评论
也是今天的笔试,估计是一样的编程题,第一天没看懂他那个除法是什么,直接去看了第二题,第二题我写的没你这么多,我就先把arraylist转数组,然后arrays.sort排序,然后找数组里0的数量,在判断有没有重复的,最后判断是不是顺子只需要看最大的数减去最小的非零数是不是小于五就行。
点赞 回复 分享
发布于 2024-03-29 20:28 天津
第一题直接回溯递归就可以了,因为数组不长,压根就不担心超时😂,最终回退条件就是你用到了数的数量达到数组长度,然后返回sum==point。
点赞 回复 分享
发布于 2024-03-29 20:43 浙江
同学你好,问下现在是什么状态呀?进面了吗
点赞 回复 分享
发布于 2024-04-07 19:21 江苏

相关推荐

mq2:我倒是觉得这种敞亮一点好。能接受就去不能就不去呗。 完了跟现在“正常”公司一样,hr说的天花乱坠,进去一看根本就是996核动力牛马,想走又没应届生身份了。岂不是更糟。
点赞 评论 收藏
分享
评论
1
7
分享

创作者周榜

更多
牛客网
牛客企业服务