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; }